gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:15:57 28 4
gpt4 key购买 nike

我对 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 的需要。这最初让我感到悲伤。

最佳答案

免责声明:我从未真正使用过 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 s 似乎可以通过 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

关于ruby - 在另一个表上使用连接和条件进行后续查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50690724/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com