2011-11-19 9 views

Odpowiedz

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

można nazwać tak:

Model.this_month 
+0

schludny i czysty, +1 – apneadiving

+0

robi to Workin SQLite? Próbowałem uruchomić to w sqlite i rzuca ActiveRecord :: StatementInvalid: SQLite3 :: SQLException: near "<": błąd składni: SELECT "zamówienia". * FROM "orders" WHERE (created_at> '2011-11- 01 04: 00: 00.000000 'AND <' 2011-12-01 04: 59: 59.999999 ') \t od /Users/mrchess/.rvm/gems/ruby-1.9.2-p290/gems/sqlite3-1.3.4 /lib/sqlite3/database.rb:91:in 'initialize ' – kidcapital

+2

Hmm, spróbuj' BETWEEN': '" created_at BETWEEN? AND? "' –

3

Zależy jeśli szukasz wszystkich zapisów wszystkich modelach lub na konkretnym modelu etc ...

Dla pojedynczego modelu mógłby zrobić:

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

wolę SQL-mniej:

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

lub w zakresie:

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

Odpowiedzi świadczące scope przykłady są błędne. Railsy używają gorącej oceny zakresów, więc Time.now.beginning_of_month zawsze będzie początkiem miesiąca, kiedy zakres został wstępnie oceniony. Prawidłowy sposób użycia dat w zakresie to przekazanie lambda do scope.

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

W Rails 4 zakresy muszą używać wywoływalnym obiektu, takiego jak Lambda lub Proc