関連レコードでソートしたいDataMapperの中でカウント
-
19-09-2019 - |
質問
私は、次のDataMapperのリソースを持っているとしましょう。
class Post
include DataMapper::Resource
has n, :comments
...
end
class Comment
include DataMapper::Resource
belongs_to :post
...
end
記事の順序付きリストを取得するには、私はあなたが行うことができます知っています:
@posts = Posts.all(:order => :date.desc)
しかし、私はすべての記事は、彼らが持っているどのように多くのコメントで降順命じ表示したいと言うことができます。どのように私はそれを行うのでしょうか?
解決
多分同じように、順序:順序=>:comment_count_cache.desc
パフォーマンス上の理由から、これを行うための良い方法は、あなたのために使用する属性を与えるだろうポストのためのCOMMENT_COUNT値をキャッシュすることです。これはコメントモデルの作成フックの後に追加することで簡単にセットアップされます。
他のヒント
あなたは、代わりに別のクエリを呼び出す、sort_by使用することができます
@post = Post.all(:order => :date.desc).sort_by { |post| -post.comments.count }
あなたが順序を変更したい場合は、マイナス記号を取り出すことができます:
@post = Post.all(:order => :date.desc).sort_by { |post| post.comments.count }
これは構文的にいいですが、adamaigが指摘するように、それはおそらくあなたが追加のSQLクエリを追加しているので、DB内のコメントの数をキャッシュよりも悪い行います。
私は、あなたが生成するSQLがあると信じています:
SELECT posts.*, COUNT(comments.id) AS comments_count FROM posts
JOIN comments ON posts.id = comments.post_id
GROUP BY posts.id ORDER BY comments_count DESC
私の知る限りでは、これはあなたがQueryクラスをプログラムで行うことができるものではありません。このためだけにSQLにドロップします。
所属していません StackOverflow