1

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

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

这是一个时髦的例子,因为发生了时间转换。无论如何,我的问题是这还有什么问题?ActiveRecord 范围是我唯一可以依靠在运行时不评估对 Date 的调用的地方吗?

4

1 回答 1

2

当您声明 a 时,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

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

我想它可以帮助您进一步澄清原因......但是请不要犹豫,询问其他问题。我自己花了一点时间才理解这一点;)

于 2012-02-21T18:43:06.423 回答