ruby-on-rails - 将 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
解决方案
在浏览了 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
结尾
推荐阅读
- python - Python:使用子进程运行CMD,用来刷stm32 uC
- c# - 为 HttpRequestMessage.Properties 定义的字典键“MS_HttpContext”在哪里?
- javascript - setState 在本机反应中无法正常工作
- react-native - 如何将参数从反应本机 webview 传递到存储在 xcode 中的外部 javascript 文件函数
- oracle - 如何从 oracle 中的 MGMT_JOB 中删除作业?
- java - 如何使用 jpa(休眠)从表中仅选择 postgres jsonb 列
- amazon-web-services - 获取范围内的查询结果 Redshift
- java - 如何使用 Jackson 修复带有 Jersey 客户端的 MessageBodyProviderNotFoundException?
- android - 更新到 Android Studio 3.5 后,2019 年构建项目需要很长时间
- neural-network - 当我们使用激活函数时,我们如何知道一个神经元被激活了