A project
有legacy_users
和group_users
。 group_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。
在此先感謝您的幫助!