2017-04-26 44 views
0

我有一個模型 「爲MyModel」 具有以下關係:如何鏈續集加入在ActiveRecord的

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使用最後一個連接表的名字?如何獲得ActiveRecord在Sequel中生成的相同SQL?

回答

1

默認情況下,在Sequel的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聊天。