Rails获取嵌套关系作为ActiveRecord对象,无需收集/映射

Pet*_*fel 3 activerecord ruby-on-rails ruby-on-rails-3

举个例子:

一种 company has_many employees

一个 employee has_many tasks

我想按降序获得所有任务。理想情况下,我想做类似的事情Company.all.employees.tasks.order('created_at desc')。不幸的是,等到我通过时employees,我现在有了一个ActiveRecord对象数组。我已经有一段时间遇到了这个问题,并且我一直在使用mapcollect,但是按降序排序会产生比我想要的更多的开销。这可以通过SQL查询来完成,因此我确定可以在ActiveRecord中进行,但是我的研究并没有太大帮助。

编辑:该解决方案应适用于任何数量的模型。例如,如果a task has_many itemsitem has_many sub_items广告是无限的。

Rob*_*rco 5

您可以使用的一种方法是使用 through

class Company < ActiveRecord::Base
   has_many :employees
   has_many :tasks, through: :employees
end
Run Code Online (Sandbox Code Playgroud)

然后,所有员工都Company将拥有一份tasks薪水。c另一种方法是使用联接。所以假设Task belongs_toa EmployeeEmployee belongs_toaCompany

c = Company.first # for a company...
tasks = Task.where(companies:{id: c.id}).joins(employee: :company)
Run Code Online (Sandbox Code Playgroud)

所以我要问所有任务在哪里的companies表(是的,它是在哪里的表)。我们使用联接来建立必须联接的表。