Объем с периодом дней работает с даты последнего развертывания - PullRequest
2 голосов
/ 10 июля 2020

У меня есть область действия модели бронирования, которая принимает заказы в текущий период в 15 дней. он работает, поэтому в производственной среде, через день я увидел, что это не работает, в журнале применяется фильтр области действия с момента развертывания.

Во-первых, область действия выглядела так:

scope :current_availables, where(date: Date.today..Date.today+14.days )

А теперь прицел выглядит так

scope :current_availables, where(date: Date.current.beginning_of_day..Date.current+14.days )

Что происходит?

1 Ответ

4 голосов
/ 10 июля 2020

Это из документации Rails 3.1.0:

Обратите внимание, что области видимости, определенные с помощью области видимости, будут оцениваться, когда они определены, а не когда они используются. Например, следующее будет неверным:

class Post < ActiveRecord::Base
  scope :recent, where('published_at >= ?', Time.now - 1.week)
end

Приведенный выше пример будет «заморожен» до значения Time.now, когда класс Post был определен, и поэтому результирующий SQL запрос всегда будет одинаковым. Правильный способ сделать это - использовать лямбду, которая будет переоценивать область видимости каждый раз, когда она вызывается:

class Post < ActiveRecord::Base
  scope :recent, lambda { where('published_at >= ?', Time.now - 1.week) }
end

Итак, вы можете попробовать обновить свою область, чтобы использовать лямбда как второй аргумент вместо where:

scope :current_availables, -> { where(date: Date.current.beginning_of_day..Date.current+14.days) }

(Не уверен, можно ли использовать ->, если нет, lambda)

Вы также можете использовать 14.days.from_now вместо добавления 14 дней к Date.current.

...