2013-03-29 71 views
1

我看到很多使用父元素屬性進行排序的例子,但祖父母沒有。如果有另一篇文章詳細說明這一點,我找不到它,也許是因爲我不知道這個詞。所以,這裏是我的理論模型:ActiveRecord Query for Child,按祖父母排序

class GrandParent < ActiveRecord::Base 
    has_many :parents 
    has_many :children, through: :parents 
end 


class Parent < ActiveRecord::Base 
    belongs_to :grand_parent 
    has_many :children 
end 


class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

所以,我想提出兒童的名單,但我想它由祖父母來分類的。

我試圖沒用的東西像Child.joins(:grandparent).order('grandparent.name').all

但是這只是不這樣做對我來說。我嘗試了另外一百種變體,但我不能說他們背後有很多邏輯...... 任何人對此有任何好的想法?

回答

2

你可以嘗試

Child.joins(:parent => :grand_parent).order('grand_parents.name') 
+0

這種感覺更像我在找的東西。謝謝!它的運行速度比遍歷所有這些要快得多。約1秒(此方法)對於6000個對象17秒(迭代)。 – counterbeing

1

如果你不關心速度,你可以使用更明確的方法來排序這些容易理解的對象。特別是,

children.sort_by{|child| child.grand_parent.name} 

它不使用完整的SQL,如果你有很多的children不會很大,但有時它的價值優化易於實現。

+0

我只是檢查,並且工作得很好了一些實例。雖然我在這個數據庫中有大約7000個「孫子女」。如果可能的話,我很樂意看到一個解決方案,它有更多的數據庫/主動記錄。使用返回大約6000個結果的查詢,大約需要20秒。這是非常漫長的,因爲它接近Heroku的超時限制。我能想到的唯一更快的解決方案是將祖父母姓氏複製給父母或子女。但是像這樣在數據庫中有重複,只是感覺不對。謝謝! – counterbeing

+1

如果可能,最好遠離使用活動記錄時使用數組(可枚舉)排序! – spullen