Область применения Rails с использованием метода экземпляра - PullRequest
0 голосов
/ 02 марта 2020

У вас есть модель Store с атрибутом time_zone (Нью-Йорк, Лондон, Токио и др. c.).

Все магазины открыты с 8:00 до 21:00 в местном часовом поясе. .

У вас есть метод экземпляра для проверки, открыт ли магазин в данный момент:

def currently_open?
  current_store_time = Time.now.in_time_zone(time_zone)
  (8...21).cover? current_store_time.hour
end

Как создать область рельсов для всех открытых в данный момент магазинов, используя Store#currently_open? метод экземпляра (или без этого метода, но я хочу использовать синтаксис rails scope).

scope :currently_open, -> { "use Store#currently_open? here" }

Ответы [ 2 ]

2 голосов
/ 02 марта 2020

Это работает для вас?

scope :with_current_store_time, -> {
  select(all.arel.projections, "date_part('hour', NOW() at time zone time_zone) as current_store_time")
}
scope :currently_open, -> {
  with_current_store_time.where(current_store_time: 8..21)
}

В основном я переписал current_store_time в качестве области (with_current_store_time)

Я ответил на это, используя эти ссылки:

Примечания:

  1. current_store_time вероятно не описывает фактическое вычисляемое значение.

  2. current_store_time - это час возврата в указанном часовом поясе.

1 голос
/ 02 марта 2020

Если ваша таблица содержит только строку time_zone, которая содержит действительное имя часового пояса Rails (или псевдоним), вам придется каким-то образом сгенерировать список имен часовых поясов, которые в настоящее время находятся между 8:00 и 21:00.

Для этого вы можете написать вспомогательный метод, который выбирает используемые часовые пояса в вашей таблице через Store.distinct.pluck(:time_zone) и выбирает те из них, которые соответствуют критериям:

class Store
  def self.time_zones_between(hours)
    distinct.pluck(:time_zone).select do |time_zone|
      Time.use_zone(time_zone) { hours.cover?(Time.current.hour) }
    end
  end

  scope :currently_open, -> { where(time_zone: time_zones_between(8...21) }
end

Обратите внимание, что вызов Store.currently_open приведет к двум запросам: один для получения часовых поясов и один для получения фактических результатов. Вы можете избежать первого запроса, предоставив список доступных часовых поясов самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...