3

次の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)

ただし、コメントの数の降順で並べ替えられたすべての投稿を表示したいとします。どうすればいいですか?

4

3 に答える 3

2

または、別のクエリを呼び出す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クエリを追加しているため、データベースにコメント数をキャッシュするよりもパフォーマンスが低下する可能性があります。

于 2011-04-26T15:37:55.063 に答える
1

生成したい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にドロップしてください。

于 2009-10-24T03:57:11.563 に答える
1

パフォーマンス上の理由からこれを行う良い方法は、投稿のcomment_count値をキャッシュすることです。これにより、:order =>:comment_count_cache.descのように、:orderに使用する属性が提供されます。これは、コメントモデルの作成後フックを追加することで簡単に設定できます。

于 2009-11-01T03:23:37.127 に答える