嘿,如何在 Rails 3 中设置今天的记录范围?
这还行得通。我没有得到任何数据。
class MyModel < ActiveRecord::Base
scope :today, :conditions => { :created_at => Date.today }
end
"created_at"列包含日期和时间,但您只需要比较日期,因此您有两种方法(我假设您使用MySQL):
- 在以下两者之间使用:
scope :today, lambda { WHERE("created_at BETWEEN '#{DateTime.now.beginning_of_day}' AND '#{DateTime.now.end_of_day}'") }
- 使用 DATE() 函数:
scope :today, lambda { WHERE('DATE(created_at) = ?', Date.today)}
此外,您可以将"created_on"列添加到仅包含日期的表中。
更新:
def self.up
add_column table_name, :created_on, :date
add_column table_name, :updated_on, :date
end
scope :today, lambda { where(created_on: Date.today) }
我认为您可以像这样定义一个通用范围:
class MyModel < ActiveRecord::Base
scope :created_on, lambda {|date| {:conditions => ['created_at >= ? AND created_at <= ?', date.beginning_of_day, date.end_of_day]}}
def self.today
self.created_on(Date.today)
end
end
所以你可以使用
>> MyModel.today #-> records created today
>> MyModel.created_on(Date.today - 1.week) #-> records created a week ago
Rails 在类级别评估范围,因此当您使用 :conditions => { :created_at => Date.today } 时,它会评估 Date.today 并将所有记录与预先评估的日期进行比较。要避免这种情况,请使用 lamda 来定义特定于日期或时间的范围
scope :today, lambda { :conditions =>[ "created_at = ? ", Date.today] }
这是一个老问题,但仍然可以帮助任何人。
这是我解决这个问题的方法:
scope :today, -> { where(created_at: DateTime.now.beginning_of_day..DateTime.now.end_of_day) }
IMO 这是最容易理解的方法。
def self.created_today
where("created_at >= ? AND created_at < ?", Date.today, Date.tomorrow)
end