2012-01-29 73 views
1

我有Rails 3.1.2應用程序,其層次關係如下所示:分類 - >討論 - >評論按子屬性排序

一個類別有很多討論,討論有很多評論。

在分類顯示視圖,我顯示了所有屬於該類別的討論列表。我使用Kaminari進行分頁。到目前爲止,我已經成功的時候創建的討論時,命令他們,就像這樣:

@discussions = Discussion.where(:category_id => @category.id).order('created_at desc').page(params[:page])

不過,我寧願命令由屬於該討論最近的評論的時間進行討論,像大多數論壇一樣,最近更新的討論出現在屏幕的頂部。做這個的最好方式是什麼?現在

回答

2
class Category < Model 
    has_many :discussions, :dependent => :destroy 
    has_many :comments, :through => :discussions, :dependent => :destroy 

    def latest_comment_time 
    comments.last.created_at 
    end 
end 

你可以訂購Discussion.all.sort_by(&:latest_comment_time)討論。

+0

這沒有奏效。我應該補充的是,討論和評論之間存在多態關聯(討論是可以評論的),儘管我不確定這是否重要。你提到'@ forum.comments.last'的代碼似乎會得到評論,而我想要討論,但是按照每次討論中創建的最後評論來排序。 – 2012-01-30 06:33:25

+0

我把注意力集中在我試圖解釋的東西上。 – danneu 2012-01-30 07:33:32

+0

如何討論討論?我試過'@discussions = Discussion.order('latest_comment.created_at')',但它拋出了一個'SQLite3 :: SQLException:沒有這樣的列'錯誤。 – 2012-01-30 22:44:12

0

我可能會確保當評論發佈,它應該討論到當前時間戳設置updated_at列。如果您自己編寫了所有代碼,那麼使用關聯的touch選項可輕鬆完成。像這樣的例子:

class Comment < ActiveRecord::Base 
    belongs_to :commentable, :polymorphic => true, :touch => true 

    ... 
end 

這樣你可以保持排序上的updated_at屬性的討論不加入其他表或額外的Ruby代碼做這件事。這樣做可能會快很多。

如果您使用您的commentable功能的寶石什麼的話,我不能肯定地說應該怎樣配置,但它應該有它的一些配置選項。

+0

':touch'的問題在於,它在保存評論時也會觸發。想象一下,如果您可以通過編輯主題中的任何帖子來打破主題,可以設想一個論壇。 – danneu 2012-01-30 07:32:38

+0

這將是一個問題,如果它確實是一個不希望的結果。我仍然認爲這是最有效的方式,如果觸摸應該是有條件的,那麼它也可以移動到'after_create'回調或其他解決方案。我通常在數據庫級別進行所有類型的排序,而不是將其留給控制器。 – DanneManne 2012-01-30 07:45:31