2011-04-04 200 views
1

我對我來說似乎有一個簡單的要求:我想根據其子類的屬性對父類進行排序。如何基於子類的屬性對父類進行排序?

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| 

在我看來。

讚賞任何幫助,我要堅果與此(簡單?)問題,
歐文

回答

2

好,所以最後我想通了自己。

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

0

發現這個只能通過純查詢:

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 
相關問題