我有一些看起来像这样的嵌套模型:
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
答案 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)