Rails中的哪些代码不会在运行时评估(即:ActiveRecord范围等)

时间:2012-02-21 17:28:54

标签: ruby-on-rails date activerecord load-order

如果您尝试评估ActiveRecord范围中的当前日期,则可能不正确,因为在加载应用程序代码时而不是在运行时对此进行评估。你必须在lambda中传递它,如下所示:

scope :today, lambda { where(:submitted_at => Date.today.to_time.utc..(Date.today + 1).to_time.utc) }

这是一个时髦的例子,因为有时间转换。无论如何,我的问题是其他地方是一个问题吗? ActiveRecord范围是唯一可以依赖我调用Date而不在运行时进行评估的地方吗?

1 个答案:

答案 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

考虑到这将在课程加载时间内进行评估(与日期相同)。

我想这有助于你澄清这一点的原因......但是,请不要犹豫,问其他问题。我自己花了一些时间来理解这个;)