2009-09-30 34 views
3

可以說我有以下的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) 

但可以說我想顯示所有帖子按照他們有多少評論降序排列。我會怎麼做?

回答

1

出於性能考慮,這樣做的一個好方法是緩存帖子的comment_count值,然後它會爲您提供一個用於:order的屬性,或許像:order =>:comment_count_cache.desc。這很容易通過爲評論模型添加一個後創建鉤子來設置。

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

您也可以使用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查詢。