Rails Time.now, показывает запущенный сервер времени, а не фактическое время - PullRequest
4 голосов
/ 25 июня 2010

Я видел эту проблему раньше, но не знаю, как ее решить.

Скажи, что у меня есть:

class Notification < ActiveRecord::Base
  scope :current_notifications, where("starts_at <= ?", Time.now).where("ends_at >= ?", Time.now).limit(1)
end

Таким образом, объем вычисляется по времени запуска сервера, есть мысли о том, как исправить подобные случаи?

Ответы [ 2 ]

9 голосов
/ 25 июня 2010

Вам нужна лямбда. (Это создает анонимный метод, который Rails затем вызывает каждый раз, когда вызывается область.)

class Notification < ActiveRecord::Base
  scope :current_notifications, lambda {
    now = Time.now
    where("starts_at <= ?", now).where("ends_at >= ?", now).limit(1)
  }
end
0 голосов
/ 27 ноября 2013

При разработке ваши модели перезагружаются при каждом запросе.На производстве они кэшируются, поэтому область будет ссылаться на Time.now, как это было, когда модель была впервые загружена в память.

Обойдите это, используя лямбда-выражение.Лямбда-выражение будет оцениваться каждый раз, когда используется область.

Вы также можете немного высушить свое отношение, используя именованный параметр, чтобы удалить повторяющийся Time.now, как показано:

scope :current_notifications, lambda do
  where("starts_at <= :now or ends_at >= :now", now: Time.now).limit(1)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...