0
我想將單個表連接到具有特定範圍的另一個表。rails 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
我在做什麼毛病我join
和merge
所以它不會給出正確的結果呢?
任何人都可以看到它是在生成SQL
這意味着,沒有一個相關帳戶的用戶都存在於結果?
將'has_accounts'更改爲'scope:has_accounts, - > {連接(:登錄).joins(:帳戶).group('users.id')'做'MyModel.joins(:用戶).merge(User.has_acc數量)產生預期的結果? –
@AndreyDeineko不,它似乎沒有。它也改變了依賴於範圍的現有查詢的語義。 (還是)感謝你的建議。 –
請編輯用戶登錄和帳戶之間的關聯(我假設用戶有一個帳戶,有很多登錄?) –