Я довольно новичок в Sequel, и я ломаю голову, пытаясь понять, как заставить API Sequel генерировать следующий тривиальный 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
Это используетСиквел 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
, который изначально вызывал у меня горе.