如何基于子类的属性对父类进行排序?
问题描述:
我对我来说似乎有一个简单的要求:我想根据其子类的属性对父类进行排序。如何基于子类的属性对父类进行排序?
class owner
has_many :tasks
end
class task
belongs_to :owner
end
现在我想根据自己的任务的截止日期业主进行排序,使具有与“最近的”截止日期的任务所有者是第一等
我能做到这一点在Ruby中有数组排序的,但我的记录集是巨大的,我需要用AR/DBMS做到这一点..
UPDATE:
正如我琢磨解决的这个问题,一部分发生在我身上,但我不知道如何在AR中实现。
要根据任务对所有者进行排序,只有一个任务(每个所有者)是相关的,即具有最近到期日的任务。
我该如何使用AR来取我所有的业主,按他们的任务排序,并且距离最近?
更新2:
Task.order("due_date DESC").maximum("due_date", :group => 'owner')
将实际上给我的主人的对象,以正确的顺序排序为有序散列([所有者] => “DUE_DATE”)的一部分。万岁!现在唯一的问题是,我如何告诉AR用所有者对象预先加载所有相关的任务。因为在这一刻它每次发出查询我打电话
owner.tasks.each do |t|
在我看来。
赞赏任何帮助,我要坚果与此(简单?)问题,
欧文
答
好,所以最后我想通了自己。
Owner.includes(:tasks).joins(:tasks).order("tasks.due_date").group(:id)
将根据其任务的最近到期日的所有者进行排序,并会急于负载的所有任务,从而在一个单一的查询。
更新:添加了生成的SQL以响应下面的Mladen的注释。
SELECT `owners`.* FROM `owners`
INNER JOIN `tasks` ON `tasks`.`owner_id` = `owner`.`id`
GROUP BY owner.id ORDER BY tasks.due_date DESC
干杯。
答
发现这个只能通过纯查询:
Owner.find_by_sql('SELECT `owners`.*,
(SELECT `tasks`.`due_date`
FROM `tasks`
WHERE `owners`.`id` = `tasks`.`owner_id`
ORDER BY `tasks`.`due_date` DESC LIMIT 1) AS `last_due_date`
FROM `owners`
GROUP BY `owners`.`id`
ORDER BY `last_due_date` DESC;')
如果到last_due_date
需要访问,则添加到Owner
型号:
def last_due_date
if attributes['last_due_date']
attributes['last_due_date']
else
tasks.order(due_date: :desc).limit(1).first.due_date if tasks.length > 0
end
end
能否请您粘贴在这里生成SQL?谢谢。 – 2011-04-05 15:29:23
谢谢。但是我认为这个查询在Postgres中不起作用。 – 2011-04-05 21:53:37
查询正在工作,但顺序错误。 – hlcs 2016-09-08 10:43:20