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

I believe that the SQL you want to generate is:

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

As far as I know, this isn't something you can do programmatically with the Query class. Just drop into SQL for this.

于 2009-10-24T03:57:11.563 回答
1

出于性能原因执行此操作的一个好方法是缓存帖子的 comment_count 值,然后它会为您提供一个用于 :order 的属性,可能类似于 :order => :comment_count_cache.desc 。这可以通过为 Comment 模型添加创建后挂钩来轻松设置。

于 2009-11-01T03:23:37.127 回答