2016-12-01 64 views
0

我想將單個表連接到具有特定範圍的另一個表。rails ActiveRecord是否可以合併在其中加入連接的作用域?

我曾嘗試做的事不起作用,但使用子選擇的版本正常工作。

MyModelbelongs_to一個User類(has_oneMyModel)和用戶類有涉及連接到其它表一個範圍。

我所試圖做的是:

# 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這意味着,沒有一個相關帳戶的用戶都存在於結果?

+0

將'has_accounts'更改爲'scope:has_accounts, - > {連接(:登錄).joins(:帳戶).group('users.id')'做'MyModel.joins(:用戶).merge(User.has_acc數量)產生預期的結果? –

+0

@AndreyDeineko不,它似乎沒有。它也改變了依賴於範圍的現有查詢的語義。 (還是)感謝你的建議。 –

+0

請編輯用戶登錄和帳戶之間的關聯(我假設用戶有一個帳戶,有很多登錄?) –

回答

相關問題