Добавить CROSS JOIN в Арель - PullRequest
       15

Добавить CROSS JOIN в Арель

0 голосов
/ 12 сентября 2018

Мне нравится добавлять CROSS JOIN в мое приложение RoR. При использовании Arel можно добавлять соединения следующим образом:

cars.joins(Car.arel_table.join(Part.arel_table, Arel::Nodes::OuterJoin).on(Car.arel_table[:id].eq(Part.arel_table[:car_id])) В моем случае мне нужен CROSS JOIN, но он недоступен в Arel. Как я могу добавить CROSS JOIN к Arel?

Я нашел класс OuterJoin и добавил новый файл со следующим кодом:

module Arel module Nodes class CrossJoin < Arel::Nodes::Join end end end

Но, похоже, этого недостаточно, чтобы заставить его работать. Я получаю ошибку TypeError: Невозможно посетить Arel :: Nodes :: CrossJoin

1 Ответ

0 голосов
/ 20 сентября 2018

Я понял это сам после просмотра источников Arel. Мне нужно было добавить метод Visitor в Arel, чтобы он заработал, я скопировал метод visit_Arel_Nodes_InnerJoin и переименовал его.

module Arel
 module Nodes
   class CrossJoin < Arel::Nodes::Join
   end
 end
 module Visitors
   class ToSql
     def visit_Arel_Nodes_CrossJoin o, collector
       collector << "CROSS JOIN "
       collector = visit o.left, collector
       if o.right
         collector << SPACE
         visit(o.right, collector)
       else
         collector
       end
     end
   end
 end

конец

...