2011-11-19 21 views

Trả lời

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

bạn có thể gọi nó như thế này:

Model.this_month 
+0

gọn gàng và sạch sẽ, 1 – apneadiving

+0

không workin sqlite này? tôi đã cố gắng để chạy điều này trong sqlite và nó ném ActiveRecord :: StatementInvalid: SQLite3 :: SQLException: near "<": cú pháp lỗi: SELECT "orders". * FROM "orders" WHERE (created_at> '2011-11- 01 04: 00: 00.000000 'VÀ <' 2011-12-01 04: 59: 59.999999 ') \t từ /Users/mrchess/.rvm/gems/ruby-1.9.2-p290/gems/sqlite3-1.3.4 /lib/sqlite3/database.rb:91:in 'initialize ' – kidcapital

+2

Hmm, thử' GIỮA': '" created_at GIỮA? AND? "' –

3

Phụ thuộc vào nếu bạn đang tìm kiếm tất cả hồ sơ của tất cả các mô hình hoặc trên một mô hình cụ thể vv ...

Đối với một mô hình duy nhất bạn có thể làm:

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

tôi thích SQL-less:

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

hoặc là một phạm vi:

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

Những câu trả lời cung cấp scope ví dụ là sai. Đường ray sử dụng đánh giá mong muốn trên phạm vi và do đó, Time.now.beginning_of_month sẽ luôn là đầu của tháng khi phạm vi được đánh giá ban đầu. Cách chính xác để sử dụng ngày trong phạm vi là chuyển một lambda đến scope.

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

Trong Rails 4 phạm vi phải sử dụng một đối tượng có thể được gọi như Lambda hay Proc

Các vấn đề liên quan