0

我找不到如何在 rom-sql 中编写此查询。是否可以将纯sql添加到where

它查找与请求不相交的公告。 announcements.when并且requests.when是 postgres 中的 tstzrange 列。

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
)
4

2 回答 2

1

查看文档的“高级 Postgres 支持”部分,http: //api.rom-rb.org/rom-sql/ROM/SQL/Postgres/Types 看起来支持 TsTzRangerange('tstzrange', range_read_type(:tstzrange))

于 2018-08-17T08:44:02.867 回答
0

我找到了解决我的问题的方法。不确定这是否是 rom-sql 中的正确方法。如果出现任何问题,我会接受更好的答案。

在那之前,这是我的解决方案——Sequel.lit 在我的例子中,我在 Announcements 关系中定义了一个方法:

  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
于 2018-08-17T19:02:01.923 回答