想要按Datamapper中的关联记录排序进行排序

时间:2009-09-30 14:58:23

标签: ruby sorting associations datamapper

假设我有以下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)

但是,我想说我希望显示所有按顺序排列的帖子,以及他们有多少评论。我该怎么做?

3 个答案:

答案 0 :(得分: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查询。

答案 1 :(得分: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。

答案 2 :(得分:1)

出于性能原因,这样做的一个好方法是缓存帖子的comment_count值,然后为您提供一个用于:order的属性,可能是:order => :comment_count_cache.desc。这可以通过为Comment模型添加after after hook来轻松设置。