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查询来获取所有工作空间。