Ruby on rails 如何跨三个模型进行查询

Ruby on rails 如何跨三个模型进行查询,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有一个工作区、项目、用户和成员模型。一个用户有许多成员身份,并且通过成员身份有许多项目。项目属于工作空间 获取用户项目非常简单: user.projects 但是,要想获得工作空间是很棘手的。类似的情况会导致集合代理的未定义方法空间的错误 user.projects.work_spaces.unique 如何获得用户参与的一组独特的工作空间?(包含用户通过成员身份所属项目的工作空间)。user.projects是项目的集合,这就是为什么不能直接在其上调用工作空间的原因 您可以使用Enume

我有一个工作区、项目、用户和成员模型。一个用户有许多成员身份,并且通过成员身份有许多项目。项目属于工作空间

获取用户项目非常简单:

user.projects
但是,要想获得工作空间是很棘手的。类似的情况会导致集合代理的
未定义方法空间的错误

user.projects.work_spaces.unique

如何获得用户参与的一组独特的工作空间?(包含用户通过成员身份所属项目的工作空间)。

user.projects
是项目的集合,这就是为什么不能直接在其上调用
工作空间的原因

您可以使用Enumerable的
collect
方法(或
map
)获取所有集合,然后去除重复项:

user.projects.collect(&:work_spaces).flatten.uniq

user.projects
是项目的集合,因此不能直接在其上调用
work\u spaces

您可以使用Enumerable的
collect
方法(或
map
)获取所有集合,然后去除重复项:

user.projects.collect(&:work_spaces).flatten.uniq

如果您使用的是ActiveRecord,我建议您利用它的关联方法,以避免.collect(&:work\u spaces).flatte.uniq的代码冗长和性能较差

class User < ActiveRecord::Base
  has_many :memberships
  has_many :projects, through: :memberships
  has_many :work_spaces, through: :projects
end
class用户

然后,您将能够请求
user.work\u spaces

如果您使用的是ActiveRecord,我建议您利用其关联方法,以避免.collect(&:work\u spaces).flatte.uniq的冗长代码和较差性能

class User < ActiveRecord::Base
  has_many :memberships
  has_many :projects, through: :memberships
  has_many :work_spaces, through: :projects
end
class用户

然后,您将能够请求
user.work\u spaces

user.projects.map(&:work\u spaces).flatte.uniq
将返回通过项目关系链接到用户的所有工作空间(uniq将删除重复对象)
user.projects.map(&:work\u spaces).flatte.uniq
将返回通过项目关系链接到用户的所有工作空间(uniq将删除重复的对象)为什么不
Enumerable#flat_map
?:)即
user.projects.flat_map(&:work_spaces)。uniq
至少要确保执行
user.projects.includes(:work_spaces)。收集(&:work_spaces).flat
以确保不会产生N+1个ActiveRecord查询来获取所有工作空间。为什么不
可枚举的#flat_map
?:)i、 e.
user.projects.flat\u map(&:work\u spaces).uniq
至少要确保执行
user.projects.includes(:work\u spaces).收集(&:work\u spaces).展平(&:work\u spaces).以确保不会产生N+1 ActiveRecord查询来获取所有工作空间。