Запрос продолжения с объединением и условием на другой таблице - PullRequest
0 голосов
/ 05 июня 2018

Я довольно новичок в 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, который изначально вызывал у меня горе.

1 Ответ

0 голосов
/ 05 июня 2018

Отказ от ответственности: я никогда не использовал 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 s, появляется условие соединенияможно сделать вывод через association_join См. здесь из документов например

First.association_join(:second)
    .where(Sequel[:second][:deactivated] => false)
    .qualify
    .paged_each do |first|
      # magic happens here
    end
...