我对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
的需要。
答案 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
现在,如果First
和Second
正确关联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