我对 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最初引起我悲伤的需求。
免责声明:我从未真正使用过 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)
现在,如果First和Second正确关联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)
| 归档时间: |
|
| 查看次数: |
1881 次 |
| 最近记录: |