【问题标题】:How to query across three models如何跨三个模型查询
【发布时间】:2013-08-13 05:55:00
【问题描述】:

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

获取用户项目非常简单:

user.projects

但是,要想找到工作空间是很棘手的。这样的事情会引发undefined method spaces for collection proxy 的错误。

user.projects.work_spaces.unique

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

【问题讨论】:

  • user.projects.map(&:work_spaces).flatten.uniq 将返回所有通过项目关系链接到用户的工作空间(uniq 将删除重复的对象)

标签: ruby-on-rails ruby activerecord


【解决方案1】:

如果您使用 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

【讨论】:

    【解决方案2】:

    user.projects 是一个项目集合,所以不能直接在上面调用work_spaces

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

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

    【讨论】:

    • 为什么不Enumerable#flat_map? :) 即user.projects.flat_map(&amp;:work_spaces).uniq
    • 至少,请确保执行user.projects.includes(:work_spaces).collect(&amp;:work_spaces).flatten 以确保您不会引发 N+1 ActiveRecord 查询来获取所有 WorkSpaces。
    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多