我有一个模型,其中有一个帖子的评级。
我想显示给定帖子的前5个评级列表,但我完全迷失在哪里开始。我认为find方法可能有用,但我不确定。我甚至考虑通过每个记录循环获取其大小,将其添加到哈希,排序哈希等,但这看起来太复杂了。
有谁知道我怎么可能做到这样的事情?
谢谢
编辑:我发现这是为了获得所有具有同意评级的帖子:
Post.find(:all, :include => :post_ratings, :condtions => ['post_ratings.agree = ?', true])
唯一的问题是我无法弄清楚如何从此查询中获得前五名。
答案 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')