我想将一个表连接到另一个具有特定范围的表。
我尝试做的事情不起作用,但使用子选择的版本可以正常工作。
MyModel
belongs_to
一个User
类(has_one
MyModel
)和用户类的范围涉及到其他表的连接。
我想做的是:
# doesn't work, gives user that is not inside the merged scope
MyModel.joins(:user).merge(User.has_accounts)
这会生成以下SQL,我认为应该按照我的意愿执行:
SELECT DISTINCT "my_model".* FROM
"my_model" INNER JOIN "users" ON "users"."id" =
"my_model"."user_id" LEFT OUTER JOIN "logins" ON
"logins"."user_id" = "users"."id" LEFT OUTER JOIN "logins"
"logins_users_join" ON "logins_users_join"."user_id" = "users"."id"
LEFT OUTER JOIN "accounts" ON "accounts"."login_id" =
"logins_users_join"."id"
用户范围" has_accounts
"它内部有一些连接:
scope :has_accounts, -> { joins(:logins).joins(:accounts).distinct }
我能够使用如下的子选择正确编写查询:
# works does not give my_model that has a user associated that is not in the scope
MyModel.where(user_id: User.has_accounts.select(:id))
该模型的相关部分如下:
class MyModel
belongs_to :user
end
class User
has_one :my_model
has_many :logins
has_many :accounts, through: :logins
scope :has_accounts, -> { joins(:logins).joins(:accounts).distinct }
end
class Login
belongs_to :user
has_many :accounts
end
class Account
belongs_to :login
end
我对join
和merge
做错了什么,以致它没有给出正确的结果?
任何人都能看到生成的SQL
中的内容,这意味着结果中是否存在没有关联帐户的用户?
答案 0 :(得分:0)
在深入研究这一段时间之后,似乎它是activerecord中的一个错误。本期提及:
https://github.com/rails/rails/issues/16140
并且暗示这是由于这个PR的错误:
https://github.com/rails/rails/pull/26195
该错误导致在将带有连接的内容合并到另一个查询中时生成OUTER JOINS,而不是INNER JOINS