在另一个表上使用连接和条件进行后续查询

Krz*_*mic 5 ruby sequel

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

          select f.* from first f
          join second s on f.second_id = s.id
          where s.deactivated = false
Run Code Online (Sandbox Code Playgroud)

我能想到的最好的方法是:

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

但这并select *没有select first.*,因此id对分页和抛出的顺序感到困惑PG::AmbiguousColumn: ERROR: ORDER BY "id" is ambiguous

这是使用 Sequel 5.9.0 和 Postres 10。

解决方案

感谢@engineersmnky 的建议qualify和一些进一步阅读这里是我最终使用的方法。

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

qualify方法调用解决该不确定性(并确保得到返回仅第一个表。

我还添加了sequel_pggem 以便我可以使用stream.each而不是paged_each. 这具有更好的性能,但也消除了order by id最初引起我悲伤的需求。

eng*_*nky 5

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

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

select first.* from first 
  join second on first.second_id = second.id
  where second.deactivated = false
Run Code Online (Sandbox Code Playgroud)

我认为实现将如下所示:

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
Run Code Online (Sandbox Code Playgroud)

现在,如果FirstSecond正确关联Sequel::Model,似乎可以通过association_join 文档中的 See Here推断出连接条件例如

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