【问题标题】:Sequel query with join and condition on the other table在另一个表上使用连接和条件进行后续查询
【发布时间】:2018-06-05 01:11:59
【问题描述】:

我对 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。

解决方案

感谢@engineersmnky 对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 的需求,这让我最初感到悲伤。

【问题讨论】:

    标签: ruby sequel


    【解决方案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::Models 似乎可以通过 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 2023-03-06
      • 2022-01-15
      • 2012-11-27
      • 2013-02-20
      • 2016-01-13
      相关资源
      最近更新 更多