gpt4 book ai didi

ruby - 如何在 ARel 中执行完全连接?

转载 作者:数据小太阳 更新时间:2023-10-29 07:56:51 26 4
gpt4 key购买 nike

假设我有两个表 TableATableB 通过连接表 TableABJoin 建立多对多关系。我想使用 ARel 3 生成一个查询,该查询执行 TableATableB 的完全连接。

我想生成的查询应该是这样的:

SELECT a.id, b.code
FROM TableA as a, TableB as b

这导致表 A 和 B 的完全连接。

在不编写显式 sql 字符串的情况下,我能得到的最接近的方法是破解外部连接:

part_a = TableA.arel_table
part_b = TableB.arel_table
query = part_a.join(part_b, Arel::Nodes::OuterJoin).on('1=1').project(part_a[:id], part_b[:code]).to_sql

这会产生以下 SQL:

SELECT "TableA"."id", "TableB"."code" FROM "TableA" LEFT OUTER JOIN "TableB" ON 1=1

如果我排除 .on 组件,我将以尾随 NULL 结尾:

SELECT "TableA"."id", "TableB"."code" FROM "TableA" LEFT OUTER JOIN "TableB" NULL

是否有更合理的方法来生成正确的完整连接或至少生成相同的结果而无需破解 ARel 中的左外部连接?

最佳答案

实际上,arel 无法执行全外连接(和右外连接),它只支持内连接和外连接(LEFT OUTER)。

因为我不喜欢这样,所以我更新了 arel 3-0-stable(我正在处理 3.2.13 rails 应用程序),以便它也支持右外连接和全外连接。即使使用未记录的代码,添加这些也非常简单,非常简单,因此如果您尝试,应该不会遇到任何问题。

在这里你可以找到我的拉取请求:https://github.com/rails/arel/pull/202
在这里您可以找到带有分支的更新存储库:https://github.com/Fire-Dragon-DoL/arel/tree/3-0-right-full-outer-join

您可以通过将其添加到您的 Gemfile 中轻松地在 Rails 应用程序中使用它:

gem 'arel', '~> 3.0.3.4', github: 'Fire-Dragon-DoL/arel', branch: '3-0-right-full-outer-join'

在这里你可以看到一个语法示例:

class Cat < ActiveRecord::Base
has_many :cat_diseases
end
class Disease < ActiveRecord::Base
has_many :cat_diseases
end

class CatDisease < ActiveRecord::Base
belongs_to :cat
belongs_to :disease

def self.all_diseases_for_cat(cat)
cat_diseases = self.arel_table
diseases = Disease.arel_table

scoped
.joins(
cat_diseases.join(diseases, Arel::Nodes::RightOuterJoin)
.on(cat_diseases[:disease_id].eq(diseases[:id]))
.join_sources
)
.where(
cat_diseases[:cat_id].eq(cat.id)
.or(cat_diseases[:cat_id].eq(nil))
)
end
end

关于ruby - 如何在 ARel 中执行完全连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12092269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com