如何像在 ActiveRecord 中那样在 Sequel 中链接连接
How to chain joins in Sequel as in ActiveRecord
我有一个模型 "MyModel" 具有以下关系:
Class MyModel
#if MyModel < ActiveRecord::Base
has_one a
has_one b
#if MyModel < Sequel::Model
many_to_one a
many_to_one b
end
使用 ActiveRecord:
MyModel.joins(:a, :b)
或
MyModel.joins(:a).joins(:b)
给出以下 SQL:
SELECT * FROM my_models INNER JOIN bs ON bs.id = my_models.b_id INNER JOIN as ON a.id = my_models.a_id
但是 Sequel:
MyModel.join(:as, id: :a_id).join(:bs, id: :b_id)
给出以下 SQL:
SELECT * FROM my_models INNER JOIN bs ON bs.id = my_models.b_id INNER JOIN as ON a.id = bs.a_id
为什么 join
使用最后加入的 table 的名字?如何在 Sequel 中获得由 ActiveRecord 生成的相同 SQL?
默认情况下,在 Sequel 的 join
中,隐式限定符是最后加入的 table。
所以,
MyModel.join(:as, id: :a_id).join(:bs, id: :b_id)
等于:
MyModel.join(:as, id: :a_id).join(:bs, id: Sequel[:as][:b_id])
使用显式限定符:
MyModel.join(:as, id: :a_id).join(:bs, id: Sequel[:my_models][:b_id])
这来自与@jeremyevans 的官方 Sequel IRC 聊天。
我有一个模型 "MyModel" 具有以下关系:
Class MyModel
#if MyModel < ActiveRecord::Base
has_one a
has_one b
#if MyModel < Sequel::Model
many_to_one a
many_to_one b
end
使用 ActiveRecord:
MyModel.joins(:a, :b)
或
MyModel.joins(:a).joins(:b)
给出以下 SQL:
SELECT * FROM my_models INNER JOIN bs ON bs.id = my_models.b_id INNER JOIN as ON a.id = my_models.a_id
但是 Sequel:
MyModel.join(:as, id: :a_id).join(:bs, id: :b_id)
给出以下 SQL:
SELECT * FROM my_models INNER JOIN bs ON bs.id = my_models.b_id INNER JOIN as ON a.id = bs.a_id
为什么 join
使用最后加入的 table 的名字?如何在 Sequel 中获得由 ActiveRecord 生成的相同 SQL?
默认情况下,在 Sequel 的 join
中,隐式限定符是最后加入的 table。
所以,
MyModel.join(:as, id: :a_id).join(:bs, id: :b_id)
等于:
MyModel.join(:as, id: :a_id).join(:bs, id: Sequel[:as][:b_id])
使用显式限定符:
MyModel.join(:as, id: :a_id).join(:bs, id: Sequel[:my_models][:b_id])
这来自与@jeremyevans 的官方 Sequel IRC 聊天。