在另一个表上使用join和condition进行续集查询

时间:2018-06-05 01:12:00

标签: ruby sequel

我对Sequel很陌生,我正试图弄清楚如何让Sequel的API生成以下简单的SQL:

          select f.* from first f
          join second s on f.second_id = s.id
          where s.deactivated = false

我能想到的最好的是:

      First.join(:second, deactivated: false, id: :second_id)
        .paged_each do |first|
          # magic happens here
        end

select *不是select first.*,因此对于id要求分页和抛出PG::AmbiguousColumn: ERROR: ORDER BY "id" is ambiguous

的内容感到困惑

这是使用Sequel 5.9.0和Postres 10。

解决方案

感谢@ engineermnky关于qualify的建议,以及我最终使用的方法。

      First.join(:second, id: :second_id, deactivated: false)
        .qualify
        .stream.each do |first|
          # magic happens here
        end

qualify方法调用解决了歧义(并确保只返回第一个表。

我还添加了sequel_pg gem,因此我可以使用stream.each而不是paged_each。这具有更好的性能,但也消除了最初导致我悲伤的order by id的需要。

1 个答案:

答案 0 :(得分:1)

免责声明:我从未真正使用sequel

似乎有一种方法Sequel::Dataset#qualify可以完全按照您的要求进行,并且应该导致:

select first.* from first 
  join second on first.second_id = second.id
  where second.deactivated = false

我认为实施方式如下:

First.join(:second, id: :second_id)
    .where(Sequel[:second][:deactivated] => false) 
    #OR .where("second.deactivated": false)
    #OR .where{[[second[:deactivated],false]]}
    .qualify
    .paged_each do |first|
      # magic happens here
    end

现在,如果FirstSecond正确关联Sequel::Model,则可以通过association_join See Here from the docs推断出加入条件,例如

First.association_join(:second)
    .where(Sequel[:second][:deactivated] => false)
    .qualify
    .paged_each do |first|
      # magic happens here
    end