2013-09-26 18 views
0

A projectlegacy_usersgroup_usersgroup_users必須經過groups得到users。我想構建一個project.users,將這些查詢合併爲一個arel。有查詢工作,但需要ActiveRelation而不是

這裏是Project

class Project < ActiveRecord::Base 
    has_many :project_accesses 

    has_many :groups,  through: :project_accesses, source: :group 
    has_many :legacy_users, through: :project_accesses, source: :user 
    has_many :group_users, through: :groups, source: :users 
end 

這裏是Project.find(1).legacy_users SQL:

SELECT "users".* FROM "users" INNER JOIN "project_accesses" ON "users"."id" = 
"project_accesses"."user_id" WHERE "users"."deleted_at" IS NULL AND 
"project_accesses"."deleted_at" IS NULL AND "project_accesses"."project_id" = 1 

這裏是Project.find(1).group_users SQL:

SELECT "users".* FROM "users" INNER JOIN "group_memberships" ON "users"."id" = 
"group_memberships"."user_id" INNER JOIN "groups" ON "group_memberships"."group_id" = 
"groups"."id" INNER JOIN "project_accesses" ON "groups"."id" = 
"project_accesses"."group_id" WHERE "users"."deleted_at" IS NULL AND 
"group_memberships"."deleted_at" IS NULL AND "groups"."deleted_at" IS NULL AND 
"project_accesses"."deleted_at" IS NULL AND "project_accesses"."project_id" = 1 

通過簡單地在INNER JOIN "project_accesses"賴斯添加OR重刑,我得到了我想要的。 Project.find(1).users

SELECT "users".* FROM "users" INNER JOIN "group_memberships" ON "users"."id" = 
"group_memberships"."user_id" INNER JOIN "groups" ON "group_memberships"."group_id" = 
"groups"."id" INNER JOIN "project_accesses" ON ("groups"."id" = 
"project_accesses"."group_id" OR "users"."id" = "project_accesses"."user_id") WHERE 
"users"."deleted_at" IS NULL AND "group_memberships"."deleted_at" IS NULL AND 
"groups"."deleted_at" IS NULL AND "project_accesses"."deleted_at" IS NULL AND 
"project_accesses"."project_id" = 1 

基本上我只是改變使查詢做我想做的:

INNER JOIN "project_accesses" ON ("groups"."id" = "project_accesses"."group_id" OR "users"."id" = "project_accesses"."user_id") 

問題是,現在,這僅僅是傳遞到find_by_sql一個字符串,我想不出如何使這是一個適當的Arel。

在此先感謝您的幫助!

回答

0

我越來越近:

User.joins(:groups).joins("inner join project_accesses on (groups.id = 
project_accesses.group_id or users.id = project_accesses.user_id)"). 
where(project_accesses: {project_id:1}).merge(Group.scoped). 
merge(GroupMembership.scoped).merge(ProjectAccess.scoped).uniq 

有什麼辦法來寫這個部分阿雷爾?

joins("inner join project_accesses on (groups.id = 
project_accesses.group_id or users.id = project_accesses.user_id)") 

此外,有沒有辦法自動包含所有連接模型的默認範圍,以避免:

.merge(Group.scoped).merge(GroupMembership.scoped).merge(ProjectAccess.scoped) 
相關問題