首页 > 解决方案 > 将 CROSS JOIN 添加到 Arel

问题描述

我喜欢将 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 中不可用。如何向 Arel 添加 CROSS JOIN?

我找到了 OuterJoin 类,并添加了一个包含以下代码的新文件:

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

但这似乎还不足以让它发挥作用。我收到一个 TypeError:无法访问 Arel::Nodes::CrossJoin

标签: ruby-on-railsactiverecordarel

解决方案


在浏览了 Arel 资源后,我自己弄清楚了。我需要向 Arel 添加一个 Visitor 方法以使其工作,我复制了 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

结尾


推荐阅读