rails ActiveRecord可以合并其中包含连接的范围吗?

时间:2016-12-01 14:28:59

标签: ruby-on-rails ruby activerecord

我想将一个表连接到另一个具有特定范围的表。

我尝试做的事情不起作用,但使用子选择的版本可以正常工作。

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

我对joinmerge做错了什么,以致它没有给出正确的结果?

任何人都能看到生成的SQL中的内容,这意味着结果中是否存在没有关联帐户的用户?

1 个答案:

答案 0 :(得分:0)

在深入研究这一段时间之后,似乎它是activerecord中的一个错误。本期提及:

https://github.com/rails/rails/issues/16140

并且暗示这是由于这个PR的错误:

https://github.com/rails/rails/pull/26195

该错误导致在将带有连接的内容合并到另一个查询中时生成OUTER JOINS,而不是INNER JOINS