Rails,嵌套has_many关联,找到所有孩子

时间:2011-08-27 00:53:26

标签: ruby-on-rails ruby

我有一些看起来像这样的嵌套模型:

class Company
  has_many :managers
end

class Manager
  has_many :employees
end

class Employee
  has_many :tasks
end

class Task
end

所以这一切都很好但是如果我在Company控制器并且我想为该公司的所有员工获得所有Task.ids该怎么办?最大的问题是,Mongoid没有像AR这样的has_many :through => resource_name,所以我怎么能避免像丑陋的东西:

@company = Company.find params[:id]

@company.managers.each do |manager|
  manager.employees.each do |employee|
    employee.tasks.each do |task|
      puts task.id
    end
  end
end

3 个答案:

答案 0 :(得分:5)

也许有一种Rails方式可以做到这一点,我不知道,但你可以使用一些简单的Ruby技巧:

puts @company.managers.map(&:employees).flatten.map(&:tasks).flatten.map(&:id)

答案 1 :(得分:1)

我知道这个问题很久以来就得到了解答,但我发现这个帖子并想要注意以下内容可能是一个稍微紧凑的解决方案:

puts @company.managers.map(&:employees).flat_map(&:tasks).flat_map(&:id)

答案 2 :(得分:1)

上面的答案看起来不错,但是如果我们对连接尝试相同的话,执行起来会更快。请看下面的代码。

对于公司的所有员工

@company = Company.find params[:id]
Employee.joins(manager: :company).where('manager.company_id=?', @company.id)

针对公司的所有任务

Task.joins(employee: [manager: :company]).where('manager.company_id=?', @company.id)