2012-03-22 160 views
1

協會聯合訂貨,我有兩個型號,郵政和評論。帖子有很多評論和評論屬於帖子。在Rails的3

我想要做的,是有一個由創建日期排序,除非它有評論文章列表。然後它需要採取最新評論的創建日期。

現在我知道我可以包括這樣的聯想:

Post.find(:all, :include => [:comments], :order => "comments.created_at DESC, posts.created_at DESC") 

但這會先訂購帶有註釋的所有帖子沒有評論的帖子。我不想要單獨訂購,但要合併。

該解決方案還需要與一個PAGINATE寶石一樣will_paginate兼容。

編輯

我現在用下面的代碼工作:

posts_controller.rb 

@posts = Post.order('updated_at DESC').page(params[:page]).per_page(10) 
comments_controller.rb 

@post = Post.find(params[:post_id]) 
@post.update_attributes!(:updated_at => Time.now) 

回答

2

我建議:
添加last_commented_at日期字段來發表您的模型。每當有人對帖子更新該字段發表評論時。它有點去規範你的數據庫結構,但你的查詢將更快,更加困難。

+0

+1的選項#2。 – Brandan 2012-03-22 20:57:10

+0

+1的非規範化 – 2012-03-22 23:24:53

1

Postgres的

Post.paginate(:include => [:comments], 
    :order => "COALESCE(comments.created_at, posts.created_at)", 
    :page => 1, :per_page => 10) 

MySQL的

Post.paginate(:include => [:comments], 
    :order => "IFNULL(comments.created_at, posts.created_at)", 
    :page => 1, :per_page => 10) 
+0

更新更好的解決方案了答案,看一看。 – 2012-03-22 21:11:51

+0

那麼這是什麼意思排序的職位說明和評論遞增。你正在處理一套,所以整個集合必須有一個排序順序。也許你可以提供你的需求的更多細節。 – 2012-03-22 23:31:26

+0

最新帖子(它是否有意見或沒有)去頂。但是在每篇文章中,評論都以發佈的順序顯示。所以第一個在上面。 – DeanAlexRainier 2012-03-23 08:29:15