Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使查询工作,但希望改为ActiveRelation_Sql_Ruby On Rails_Activerecord_Join_Active Relation - Fatal编程技术网

Sql 使查询工作,但希望改为ActiveRelation

Sql 使查询工作,但希望改为ActiveRelation,sql,ruby-on-rails,activerecord,join,active-relation,Sql,Ruby On Rails,Activerecord,Join,Active Relation,一个项目有遗留用户和组用户组用户必须通过组才能获得用户。我想构建一个项目。用户将这些查询组合为arel 以下是项目: class Project < ActiveRecord::Base has_many :project_accesses has_many :groups, through: :project_accesses, source: :group has_many :legacy_users, through: :project_a

一个
项目
遗留用户
组用户
<代码>组用户必须通过
才能获得
用户
。我想构建一个
项目。用户
将这些查询组合为arel

以下是
项目

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
下面是用于
项目的sql。查找(1)。对用户进行分组

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
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
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
只需在
内部连接“project\u access”
条件上添加
,我就可以得到我想要的<代码>项目.查找(1).用户:

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
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
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")
现在的问题是,这只是一个字符串,通过sql传递到
find\u,我不知道如何使它成为一个正确的Arel


提前感谢您的帮助

您应该能够使用ARel的
joins
方法手动构建您的join,并且仍然可以恢复一个活动关系

我越来越近了:

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
有没有办法用Arel来写这部分

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)