如何在ActiveRecord中链接Sequel中的连接

时间:2017-04-26 16:58:59

标签: sql ruby-on-rails ruby sequel

我的模型“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?

1 个答案:

答案 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聊天。