我以前见过这个问题,但我不知道如何解决它。
说我有:
class Notification < ActiveRecord::Base
scope :current_notifications, where("starts_at <= ?", Time.now).where("ends_at >= ?", Time.now).limit(1)
end
因此范围是从服务器启动的时间开始计算的,有关如何修复此类实例的任何想法吗?
答案 0 :(得分:9)
你需要一个lambda。 (这会创建一个匿名方法,Rails会在每次调用范围时调用它。)
class Notification < ActiveRecord::Base
scope :current_notifications, lambda {
now = Time.now
where("starts_at <= ?", now).where("ends_at >= ?", now).limit(1)
}
end
答案 1 :(得分:0)
开发时,每个请求都会重新加载模型。在生产时,它们被缓存,因此范围将引用Time.now,就像模型首次加载到内存中一样。
使用lambda表达式绕过它。每次使用范围时,都会评估lambda表达式。
您还可以使用命名参数稍微干掉您的关系以删除重复的Time.now,如下所示:
scope :current_notifications, lambda do
where("starts_at <= :now or ends_at >= :now", now: Time.now).limit(1)
end