2011-02-10 11 views
3

は、私はそれがほとんどのコメントが注文した記事を取得するためにはActiveRecordのクエリを実行することが可能です多くのCommentsアクティブレコード内の関連の数で注文することはできますか?

Postsを考えてみましょうか?

私はこの比較的一般的なクエリには驚いています。古いMySQLはARで簡単に答えられないようです。はい、counter_cacheを使用できますが、これは元のクエリを実際に再作成するものではありません。

私には何が欠けていますか?

これをさらに進めてください。 PostsCommentsが多く、Likesが多い場合はどうなりますか?多くの好きな人が集まった投稿を取得することは可能ですか?

ありがとうございます!

答えて

1

あなたが言うように、counter_cacheは「レールのやり方」に最も近いようです。これまでのところ私は、この特定の目的のために任意のAR定義されたメソッドを発生していないが、これは私が見てきたことをそれに最も近いものです:

@posts = Post.select("posts.*, COUNT(comments.id) AS count_comments").joins("LEFT OUTER JOIN comments ON posts.id = comments.post_id").group("posts.id").order("count_comments DESC") 

@posts.each do |post| 
    puts "Comments: #{post.count_comments}" 
end 

count_comments属性を含めるように[カスタム]を選択します。 includeの代わりにjoinを使用すると、select構文が上書きされます。カスタムは単にコメントの代わりに構文を結合します。それ以外の場合は、コメントのない投稿を取得しないようにする内部結合になるからです。

これは基本的に全体のSQLを自分で構文書いているが、それでも...それは動作します:)

+0

これは唯一の解決策だと思います。すべてのカスタムSQLは本当に不快です:)彼らはいつかアクティブなレコードにこれを行うためにクリーンな方法を追加する場合は興味深いでしょう。 –

+0

ARELが今日提供している機能を考えると、単純なクエリにはraw SQLを使用するのが理にかなっています。それは私にとって非常に不愉快に見えます。 –

0

あなたが同様にあなたがしたい場合は、このような何かを行うことができますかなり確信:

posts = Post.find(:all, :include => 'comments') 
posts.sort { |a,b| b.comments.count <=> a.comments.count } 
+0

ルビーでやっているのは、テーブルに1,000レコード以下のレコードがある場合にのみ実際に動作するため、それ以上のテーブルでは実行できません。 –

+0

ああ、公正なポイント – 2potatocakes

0

私はsupose arel ::

comments= Comment.arel_table 
posts= Post.joins(:comments).order(comments[:id].count) 

これが正しい方法かどうかはわかりませんが、このようなことをすることができます。自分で試してみる必要があります。

関連する問題