2012-03-22 11 views
1

投稿とコメントの2つのモデルがあります。投稿には多くのコメントとコメントが投稿に属します。Rails 3のアソシエーションと組み合わせた注文

私がしようとしているのは、コメントがない限り、作成日順の投稿一覧を作成することです。その後、最新のコメントの作成日を取る必要があります。

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

しかし、これはコメントせずに最初にしてコメントを投稿して、すべての記事を注文します:

今、私はこのような関連付けを含むことができることを知っています。私はどちらかを別々に注文するのではなく、組み合わせることを望んでいます。

解決策は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

私がお勧めしたい:
は、あなたのPostモデルにlast_commented_at日付フィールドを追加します。誰かが投稿のコメントを投稿するとそのフィールドが更新されます。 DB構造のデノーマライゼーションを少しでも行いますが、クエリはより高速でより厳しいものになります。

+0

+1。 – Brandan

+0

+1の非正規化 –

1

Postgresの

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

MySQLのオプション#2の

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

答えをより良い解で更新しました。 –

+0

まあ、投稿の並べ替えとコメントの昇順はどういう意味ですか? 1つのセットを処理しているので、セット全体で1つのソート順が必要です。あなたの要件の詳細を伝えることができるかもしれません。 –

+0

最新の投稿(コメントがあるかどうかにかかわらず)が先頭に移動します。すべての投稿の下にコメントが投稿された順に表示されます。最初の上に。 – DeanAlexRainier

関連する問題