2011-11-19 985 views

Respuesta

34
class Model 
    scope :this_month, -> { where(created_at: Time.now.beginning_of_month..Time.now.end_of_month) } 
end 

se le puede llamar así:

Model.this_month 
+0

limpio y ordenado, 1 – apneadiving

+0

hace esto sqlite Workin? Estaba tratando de ejecutar esto en sqlite y lanza ActiveRecord :: StatementInvalid: SQLite3 :: SQLException: cerca de "<": error de sintaxis: SELECCIONE "pedidos". * FROM "orders" WHERE (created_at> '2011-11- 01 04: 00: 00.000000 'Y <' 2011-12-01 04: 59: 59.999999 ') \t de /Users/mrchess/.rvm/gems/ruby-1.9.2-p290/gems/sqlite3-1.3.4 /lib/sqlite3/database.rb:91:in 'initialize ' – kidcapital

+2

Hmm, intente' BETWEEN': '" created_at ENTRE? Y? " –

3

Depende de si su búsqueda de todos los registros de todos los modelos o en un modelo específico, etc ...

Para un solo modelo que podría hacer:

User.where('created_at >= ? and created_at <= ?', Time.now.beginning_of_month, Time.now.end_of_month) 
21

prefiero SQL-menos:

Model.where(:created_at => Time.now.beginning_of_month..Time.now.end_of_month) 

o como un ámbito de aplicación:

class Model < ActiveRecord::Base 
    scope :this_month, -> { where(:created_at => Time.now.beginning_of_month..Time.now.end_of_month) } 
end 
2

Las respuestas que proporcionan scope ejemplos están equivocados. Rails usa una evaluación entusiasta de los ámbitos y, por lo tanto, Time.now.beginning_of_month siempre será el comienzo del mes cuando se evaluó inicialmente el alcance. La forma correcta de usar las fechas en un ámbito es pasar una lambda al scope.

class Model < ActiveRecord::Base 
    scope :this_month, -> { where(created_at: Time.now.beginning_of_month..Time.now.end_of_month) } 
end 

En Rails 4 ámbitos deben utilizar un objeto invocable como Lambda o Proc