Запрос Activerecord с условием на следующую запись - PullRequest
0 голосов
/ 07 марта 2020

У меня есть модель Event с атрибутом starts для даты начала. Событие заканчивается, когда начинается следующее событие (последнее событие продолжается бесконечно). Я хотел бы иметь запрос, который возвращает события, начиная с события, которое содержит данную дату dd:

Event.since(Date.today)

должно возвращать текущее событие и следующие.

I может легко сделать это с двумя запросами:

first=Event.where(starts: -Float::INFINITY..Date.today).order(starts: :asc).last
Event.where(starts: first.starts..Float::INFINITY)

, но есть ли что-нибудь более эффективное?

Это с postgresql, в случае, если это имеет значение

1 Ответ

2 голосов
/ 08 марта 2020
class Event < ApplicationRecord
  # @see https://devhints.io/arel
  def self.after(time = Time.current)
    col = arel_table[:starts]
    sub_query = arel_table.project(col)
                          .where(col.lt(time))
                          .order(col.asc)
                          .take(1)
    where(col.gt(sub_query))
  end
end

Создает подзапрос в предложении where:

SELECT "events".* FROM "events" 
WHERE "events"."starts" > (SELECT "events"."starts" FROM "events" WHERE "events"."starts" < '2020-03-08 17:32:16.602529' ORDER BY "events"."starts" ASC LIMIT 1) LIMIT $1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...