Как построить 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