Ruby on rails Rails中的哪些代码在运行时不被评估(例如:ActiveRecord范围等)
如果您尝试在ActiveRecord作用域中计算当前日期,则可能不正确,因为在加载应用程序代码而不是在运行时计算当前日期。你必须通过一个lambda,像这样:Ruby on rails Rails中的哪些代码在运行时不被评估(例如:ActiveRecord范围等),ruby-on-rails,date,activerecord,load-order,Ruby On Rails,Date,Activerecord,Load Order,如果您尝试在ActiveRecord作用域中计算当前日期,则可能不正确,因为在加载应用程序代码而不是在运行时计算当前日期。你必须通过一个lambda,像这样: 范围:今天,lambda{where(:submitted_at=>Date.today.to_time.utc..(Date.today+1.to_time.utc)} 这是一个很奇怪的例子,因为有时间的转换。不管怎样,我的问题是,这还有什么关系?ActiveRecord作用域是唯一一个我可以指望到目前为止的调用在运行时不会被评估的
范围:今天,lambda{where(:submitted_at=>Date.today.to_time.utc..(Date.today+1.to_time.utc)}
这是一个很奇怪的例子,因为有时间的转换。不管怎样,我的问题是,这还有什么关系?ActiveRecord作用域是唯一一个我可以指望到目前为止的调用在运行时不会被评估的地方吗?当您声明
作用域时,您正在调用类本身的作用域
方法。正如您所说,这是在加载时完成的,而不是在运行时完成的
每次在类的声明中调用方法时都会发生这种情况。一些例子:
class Car < ActiveRecord::Base
acts_as_combustion_machine
belongs_to :driver
has_many :wheels
end
考虑到这将在类加载期间进行评估(与日期相同)
我想这有助于你更清楚地解释原因。。。但请不要犹豫,如果还有其他问题,请提问。我自己花了一点时间才明白这一点;) 谢谢你的回答。我提出这个问题的直接动机是不要让相同的“范围内的日期”错误发生在我的验证中。例如,在validate块中使用Date.today。这似乎不是一个问题,因为验证是在运行时在ActiveRecord对象的生命周期中进行评估的。
acts_as_combustion_machine Engine.first