2011-11-19 15 views

risposta

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

si può chiamare in questo modo:

Model.this_month 
+0

ordinato e pulito, +1 – apneadiving

+0

fa questo workin SQLite? stavo cercando di eseguire questo in sqlite e genera ActiveRecord :: Istruzione non valida: SQLite3 :: SQLException: vicino a "<": errore di sintassi: SELECT "orders". * FROM "orders" WHERE (created_at> '2011-11- 01 04: 00: 00.000000 'AND <' 2011-12-01 04: 59: 59.999999 ') \t da /Users/mrchess/.rvm/gems/ruby-1.9.2-p290/gems/sqlite3-1.3.4 /lib/sqlite3/database.rb:91:in 'initialize ' – kidcapital

+2

Hmm, prova' BETWEEN': '" created_at TRA? AND? "' –

3

Dipende se la vostra ricerca per tutti i record di tutti i modelli o su un modello specifico ecc ...

Per un singolo modello poteva fare:

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

preferisco SQL-less:

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

o come un campo di applicazione:

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

Le risposte che forniscono scope esempi sono sbagliate. Rails utilizza la valutazione appassionata sugli ambiti e pertanto Time.now.beginning_of_month sarà sempre l'inizio del mese in cui l'ambito è stato inizialmente valutato. Il modo corretto di utilizzare le date in un ambito è passare un lambda allo scope.

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

In Rails 4 ambiti devono utilizzare un oggetto richiamabile come Lambda o Proc

Problemi correlati