2011-11-13 9 views
2

は、私は次のモデルで3.1アプリレールを持っています。
数コメント手段上:レール3.1データベースクエリ

問題は、例えばポストAは、私は、クエリは、このような何かをしたいポストB.

上の最も最近のコメントよりも新しい3件のコメントを持っている場合ということです1 =最新の10 =最も古い。

Post A 
comment 1 #=>ok fetch the post 
Post B 
comment 2 #=>ok fetch the post 
comment 3 #=>this post is fecthed go on find the next one 
comment 4 #=>this post is fecthed go on find the next one 
Post C 
comment 5 #=>ok fetch the post 
comment 6 #=>this post is fecthed go on find the next one 
Post D 
comment 7 #=>ok fetch the post 
comment 8 #=>this post is fecthed go on find the next one 
Post E 
comment 9 #=>ok fetch the post 
comment 10 

これを行うためにエレガントなクエリを作成することはできますか?ポストテーブルのcomment_updated_atカラム:

可能な解決策は、更新することです。

+0

FYI私はActiveRecordのを使用する:: Baseが関係の中で=>モデル化していないではありません。下記参照。 –

+0

私はそうです!モデレータが元の投稿を編集しました。私はコードではなくテキストで書きました。コードでうまく見えるが、司会者はコードを間違っていた。今修正して申し訳ありません! –

答えて

3

これは著作必要があります。

comments = Comment.order("updated_at DESC").group(:post_id).limit(5) 

これは5件の最後のコメントを返します。明確な投稿をしています。

だから後にあなただけのことができます:

recent_commented_posts = comments.map(&:post) 

出来上がり。

+0

うん!これが私が使用しようとしているものです。ありがとう! –

+0

+1良い答え! – Tilo

0

あなたのコメントモデルはRailsのモデルであれば、それはすでにupdated_atの列を持っている必要があります。

Comment.order(:by => :updated_at).limit(5) 

は、それに伴う問題は、あなたが唯一の5件の最新のコメントを得ることである - それらは、5種類のポストでは必ずしもありません。一方

、あなたは、このような5つの最後に更新コメントと5件のユニークな記事を見つけることができます。

comments = Comment.order(:by => :updated_at).select("DISTINCT(post_id)").limit(5) 

をしかし、これは、これらの5つの記事のために、すべてのコメントは表示されません。

それはポストのそれぞれに関連したコメントを一覧表示し、その後、post_idのを経由してポストに到達するために、最初の2番目のクエリを実行するために、おそらく最善です。これらの線に沿って

何か:(もちろん、あなたが「プット」せずに、ビューでこれを行う必要がある)

comments.each do |c| 
    puts c.post.name 
    puts c.post.comments.order(:by => :updated_at) # instead of just showing one comment 'c' 
end 
+0

ありがとう!しかし、最初のものは、よりエレガントだった –

+0

彼のコードは基本的に私の第二の例と同じです。彼は 'select'を使って' group'を使います。はい、彼の答えはよりエレガントです。なぜなら、SQLを使用しないからです。 – Tilo

関連する問題