Rails将嵌套关系作为ActiveRecord对象获取而不使用collect / map

时间:2013-04-14 20:03:02

标签: ruby-on-rails ruby-on-rails-3 activerecord

举个例子:

A company has_many employees

employee has_many tasks

我希望按降序排列所有任务。理想情况下,我想做Company.all.employees.tasks.order('created_at desc')之类的事情。不幸的是,当我通过employees时,我现在有一个ActiveRecord对象数组。我已经遇到了这个问题一段时间了,我刚刚使用mapcollect,但是按降序排序会产生比我想要的更多的开销。这可以通过SQL查询完成,所以我确信我可以在ActiveRecord中完成它,但我的研究没有多大帮助。

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

1 个答案:

答案 0 :(得分:4)

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

class Company < ActiveRecord::Base
   has_many :employees
   has_many :tasks, through: :employees
end

然后Company将为其所有员工提供tasks。 C 另一种方法是使用连接。假设Task belongs_to一个EmployeeEmployee belongs_to一个Company

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

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