Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 带PostgreSQL重叠方法的Arel表_Ruby On Rails_Postgresql_Arel - Fatal编程技术网

Ruby on rails 带PostgreSQL重叠方法的Arel表

Ruby on rails 带PostgreSQL重叠方法的Arel表,ruby-on-rails,postgresql,arel,Ruby On Rails,Postgresql,Arel,首先,我承认有两种不同的方法可以实现重叠,但是关于这个问题,我特别想弄清楚如何将实际的PostgreSQL重叠方法与Arel结合使用。为此,这个问题更多地是为了更好地理解Arel,而不是实现某些版本的重叠功能 我使用的是Rails 5.1 这是我试图在Arel中复制的SQL语句: SELECT DISTINCT venues.id FROM venues LEFT OUTER JOIN reservations ON venues.id = reservations.venue_

首先,我承认有两种不同的方法可以实现重叠,但是关于这个问题,我特别想弄清楚如何将实际的
PostgreSQL重叠
方法与
Arel
结合使用。为此,这个问题更多地是为了更好地理解Arel,而不是实现某些版本的重叠功能

我使用的是
Rails 5.1

这是我试图在Arel中复制的SQL语句:

SELECT DISTINCT
  venues.id
FROM
  venues
LEFT OUTER JOIN
  reservations
ON
  venues.id = reservations.venue_id
WHERE (
  (reservations.venue_id IS NULL)
  OR NOT (
    (reservations.start, reservations.end)
    OVERLAPS
    (DATE '2018-09-02', DATE '2018-09-03')
  )
)
我目前拥有以下信息,这些信息确实产生了上述信息:

Venue.arel_table.project(
  Venue.arel_table[:id]
).from(
  Venue.arel_table
).join(
  Reservation.arel_table, Arel::Nodes::OuterJoin
).on(
  Venue.arel_table[:id].eq(Reservation.arel_table[:venue_id])
).where(
 Arel::Nodes::Grouping.new(
    Reservation.arel_table[:venue_id].eq(nil)
  ).or(
    Arel.sql("NOT ((reservations.start, reservations.end) OVERLAPS (DATE '2018-09-02', DATE '2018-09-03'))")
  )
)
然而,我觉得可能有更好的方法来做到这一点;我一直试图为
重叠
实现
Arel::Nodes::NamedFunction
,但是,当我用以下语句替换上述
Arel.sql
语句时,它无法正确执行sql:

Arel::Nodes::NamedFunction.new(
  'OVERLAPS',
  [
    Arel::Nodes::SqlLiteral.new('(reservations.start, reservations.end)'),
    Arel::Nodes::SqlLiteral.new("(DATE '2018-09-02', DATE '2018-09-03')")
  ]
) 
导致

...OVERLAPS ((reservations.start, reservations.end), (DATE '2018-09-02', DATE '2018-09-03'))

Arel
实现
OVERLAPS
的正确方法是什么?

既然
OVERLAPS
是一个SQL运算符,我相信下面的表达式应该可以工作:

Arel::Nodes::InfixOperation.new(
  'OVERLAPS', 
  Arel::Nodes::SqlLiteral.new('(reservations.start, reservations.end)'),
  Arel::Nodes::SqlLiteral.new("(DATE '2018-09-02', DATE '2018-09-03')"
)