Как построить TSTZRANGE в rom-sql?

Я не могу найти, как написать этот запрос в rom-sql. Можно ли добавить простой SQL к where?

Он ищет объявления, которые не пересекаются с запросами.announcements.when а также requests.when являются столбцами цстранге в postgres.

SELECT "announcements".* FROM "announcements" WHERE (
  (SELECT COUNT(requests.id)
   FROM requests
   WHERE requests.id IN (1,2,3) AND
         (TSTZRANGE(lower(requests.when) - INTERVAL '1 HOUR', upper(requests.when) + INTERVAL '1 HOUR', '()') && 
         TSTZRANGE(lower(announcements.when)), upper(announcements.when), '()') AND
         requests.user_id = 42
  ) = 0
)

2 ответа

Ознакомьтесь с разделом "Предварительная поддержка Postgres" в документации, http://api.rom-rb.org/rom-sql/ROM/SQL/Postgres/Types похоже, что есть поддержка TsTzRange range('tstzrange', range_read_type(:tstzrange))

Я нашел решение своей проблемы. Не уверен, что это правильный путь в rom-sql. Я приму лучший ответ, если таковые появятся.

До этого вот мое решение - Sequel.litВ моем случае я определил метод в отношении объявлений:

  def available(user_id)
    request_ids = requests.by_user_id(user_id).confirmed.pluck(:id)

    # +- 1 hour around request is not available
    # last argument '()' means "do not include boundaries"
    request_when = "TSTZRANGE(
      lower(requests.when) - INTERVAL '1 HOUR',
      upper(requests.when) + INTERVAL '1 HOUR',
      '()'
    )"

    announcement_when = "TSTZRANGE(lower(announcements.when), upper(announcements.when), '()')"

    where(Sequel.lit(
      "(SELECT COUNT(requests.id)
      FROM requests
      WHERE requests.id IN (:request_ids) AND
            #{request_when} && #{announcement_when} AND
            requests.user_id = :user_id) = 0",
      user_id: user_id, request_ids: request_ids
    ))
  end
Другие вопросы по тегам