如何基于子类的属性对父类进行排序?

问题描述:

我对我来说似乎有一个简单的要求:我想根据其子类的属性对父类进行排序。如何基于子类的属性对父类进行排序?

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 

干杯。

+0

能否请您粘贴在这里生成SQL?谢谢。 – 2011-04-05 15:29:23

+0

谢谢。但是我认为这个查询在Postgres中不起作用。 – 2011-04-05 21:53:37

+0

查询正在工作,但顺序错误。 – hlcs 2016-09-08 10:43:20

发现这个只能通过纯查询:

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