如果您尝试评估ActiveRecord范围中的当前日期,则可能不正确,因为在加载应用程序代码时而不是在运行时对此进行评估。你必须在lambda中传递它,如下所示:
scope :today, lambda { where(:submitted_at => Date.today.to_time.utc..(Date.today + 1).to_time.utc) }
这是一个时髦的例子,因为有时间转换。无论如何,我的问题是其他地方是一个问题吗? ActiveRecord范围是唯一可以依赖我调用Date而不在运行时进行评估的地方吗?
答案 0 :(得分:2)
当您声明scope
时,您正在调用类本身的scope
方法。正如你所说,这是在加载时而不是在运行时完成的。
每次在声明上调用类的方法时都会发生这种情况。一些例子:
class Car < ActiveRecord::Base
acts_as_combustion_machine
belongs_to :driver
has_many :wheels
end
这些是在声明过程中在类本身上调用的方法的示例。这意味着它的任何参数都将在加载时评估,而不是在运行时评估。
我们再举一个例子。如果您想让engine
用于acts_as_combustion_machine
,您可以执行以下操作:
acts_as_combustion_machine Engine.first
考虑到这将在课程加载时间内进行评估(与日期相同)。
我想这有助于你澄清这一点的原因......但是,请不要犹豫,问其他问题。我自己花了一些时间来理解这个;)