如何查询三个模型

时间:2013-08-12 20:42:38

标签: ruby-on-rails ruby activerecord

我有一个WorkSpace,Project,User和Membership模型。用户拥有许多会员资格,许多项目通过会员资格。项目属于工作空间。

获取用户项目非常简单:

user.projects

但伸手去拿工作空间很棘手。这样的事情会引发undefined method spaces for collection proxy的错误。

user.projects.work_spaces.unique

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

2 个答案:

答案 0 :(得分:2)

如果你正在使用ActiveRecord,我建议利用它的关联方法,以避免.collect(&:work_spaces).flatten.uniq的冗长代码和较差的性能。

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

然后您就可以要求user.work_spaces了。

答案 1 :(得分:1)

user.projects是项目的集合,这就是您无法直接在其上调用work_spaces的原因。

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

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