2013-07-30 43 views
2

我該如何去做這件事?我想通過它的子節點上的屬性對選擇父模型進行排序。父母模型與孩子有很多關係。我不確定如何形成ActiveRecord查詢來獲取此信息。Ruby on Rails按子屬性訂購父母模型

示例:線程有很多帖子。我想抓取最近發佈的帖子排序的線程集合。

我發現了一些將選擇轉換爲數組並對數組進行排序的解決方案,但我需要將選擇保留爲ActiveRecord選擇,這樣我才能繼續將查詢鏈接到它。

回答

3

,我需要你的數據庫的佈局的詳細信息,以提供更好的例子,但可以通過該表像這樣加入另一個表,然後順序:

Thread.joins(:posts).order("posts.created_at").group("threads.id") 
+0

父母與孩子之間的關係是一個簡單的有很多關係。 – followfung

+0

爲什麼這不起作用? – zarazan

+3

PG ::錯誤:錯誤:列「threads.created_at」必須出現在GROUP BY子句中或用於聚合函數 – followfung

0

只用簡單的查詢,以沒有直接的迭代過數組,你可以這樣做:

Post.joins(:thread).includes(:thread).order("posts.created_at").group("thread_id").take(5) 
# Maybe you can take only a few samples of your collection to show on Last Posted Topics, 
# then you just replace take(5) with the number of posts you want to take. 
+0

我正在嘗試使用線程,而不是帖子。 – followfung

+0

然後你可以在代碼末尾貼上''''.map(&:thread).uniq''' –

3

對於你的榜樣,這將是更爲有效簡單地讓學生接觸到父:

class Thread < ActiveRecord::Base 
    has_many :posts 
end 

class Post < ActiveRecord::Base 
    belongs_to :thread, 
     touch: true 
end 

無論何時創建或更改帖子,這將更改Thread的updated_at列,以便當時認爲線程已更新。您可能需要在一個更復雜的示例中實際訪問子記錄,但對於根據子帖子的日期排序,這可以節省您不必從數據庫中獲取額外記錄的情況,而實際上並不需要該表中的信息。

+0

感謝您的輸入。實際上下文實際上比我的例子稍微複雜一些。 我實際上正在做你現在提出的建議,但是當我更新線程特有的屬性時會出現問題,但我想按最近的帖子排序。基本上我希望最新的Post優先,而不是按updated_at屬性排序。 – followfung