RoR排名前五位

时间:2010-09-02 22:24:50

标签: ruby-on-rails

我有一个模型,其中有一个帖子的评级。

我想显示给定帖子的前5个评级列表,但我完全迷失在哪里开始。我认为find方法可能有用,但我不确定。我甚至考虑通过每个记录循环获取其大小,将其添加到哈希,排序哈希等,但这看起来太复杂了。

有谁知道我怎么可能做到这样的事情?

谢谢

编辑:我发现这是为了获得所有具有同意评级的帖子:

Post.find(:all, :include => :post_ratings, :condtions => ['post_ratings.agree = ?', true])

唯一的问题是我无法弄清楚如何从此查询中获得前五名。

2 个答案:

答案 0 :(得分:1)

可能值得提供一些你正在使用的代码的例子,但我会回答一些假设。

如果你有:

class Post
  has_many :post_ratings
end

class PostRating
  belongs_to :post

  # Has a 'rating' attribute
end

您可以通过以下方式找到前五个帖子评分:

p = Post.find(:first) # For example
p.post_ratings.find(:all, :limit => 5, :order => 'rating desc')

要获得总体排名前五的评分,您可以这样做:

PostRating.find(:all, :limit => 5, :order => 'rating desc')

更新:

根据您的编辑,您似乎有“同意”和“不同意”列。不确定它是如何组合起来的,所以我会坚持使用'同意'一栏。你需要做的是计算同意标记的评级。类似的东西:

count_hsh PostRating.count(:group => 'post_id', 
                           :order => 'count(*) desc', 
                           :conditions => { :agree => true },
                           :limit => 5)

这将返回一个哈希映射,将帖子ID映射到同意评级数。然后,您可以使用该post_id来定位帖子本身。评级由计数提供,因此个人评级(我认为)没有用,尽管您可以通过调用post.post_ratings来访问它们。

所以,要获得前五个帖子:

@top_five_posts = []
count_hsh.each_pair do |post_id, ratings|
  p = Post.find(post_id)
  p[:rating_count] = ratings
  @top_five_posts << p
end

这可能比它可能更冗长,但希望是说明性的。 p[:rating_count]是一个虚拟属性,不在数据库中,但如果您愿意,可以在视图中的帖子上访问.rating_count方法。

答案 1 :(得分:0)

假设Shadwell回答相同的Post和PostRating:

class Post
  has_many :post_ratings
end

class PostRating
  belongs_to :post

  # Has a 'rating' attribute
end

获得所有帖子的前五名评分:

post_ratings.find(:all, :limit => 5, :order => 'rating desc')

要获得特定帖子的前五名,您可以:

p = Post.find(:first)
post_ratings.find_all_by_post_id(p.id, :limit => 5, :order => 'rating desc')

要查找按平均评分排序的所有帖子,您可以使用ActiveRecord :: Calculations。

PostRating.average(:rating, :group => :post_id, :include => :post, :order => 'average desc')