举个例子:
A company has_many employees
employee has_many tasks
我希望按降序排列所有任务。理想情况下,我想做Company.all.employees.tasks.order('created_at desc')
之类的事情。不幸的是,当我通过employees
时,我现在有一个ActiveRecord对象数组。我已经遇到了这个问题一段时间了,我刚刚使用map
和collect
,但是按降序排序会产生比我想要的更多的开销。这可以通过SQL查询完成,所以我确信我可以在ActiveRecord中完成它,但我的研究没有多大帮助。
编辑:
该解决方案适用于任何数量的模型。例如,如果无限task has_many items
和item has_many sub_items
广告。
答案 0 :(得分:4)
您可以使用的一种方法是使用through
class Company < ActiveRecord::Base
has_many :employees
has_many :tasks, through: :employees
end
然后Company
将为其所有员工提供tasks
。
C
另一种方法是使用连接。假设Task
belongs_to
一个Employee
和Employee
belongs_to
一个Company
c = Company.first # for a company...
tasks = Task.where(companies:{id: c.id}).joins(employee: :company)
所以我要求companies
表的所有任务(是的,它是在哪里的表)。我们使用连接来建立必须连接的表。