我的模型“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
但续集:
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
使用最后一个连接表的名称?如何在Sequel中获得ActiveRecord生成的相同SQL?
答案 0 :(得分:1)
默认情况下,在续集的join
中,隐式限定符是最后一个连接表。
所以,
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的官方续集IRC聊天。