【问题标题】:What code in Rails is not evaluated at runtime (ie: ActiveRecord scopes, etc)在运行时不评估 Rails 中的哪些代码(即:ActiveRecord 范围等)
【发布时间】:2012-03-12 00:53:07
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的出色回答。我询问的直接动机是不要让我的验证中发生相同的“范围内日期”错误。例如,在验证块中使用 Date.today。似乎这不是问题,因为验证是在 ActiveRecord 对象的生命周期中在运行时进行评估的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多