質問

私は、次の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にドロップします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top