Возможно, стоит привести немного больше примера кода, с которым вы работаете, но я отвечу с несколькими предположениями.
Если у вас есть:
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')
UPDATE:
После вашего редактирования кажется, что у вас есть столбцы "согласен" и "не согласен". Не уверен, как это работает в комбинации, поэтому я буду придерживаться колонки «согласен». Что вам нужно сделать, так это подсчитать рейтинг с пометкой «согласен». Что-то вроде:
count_hsh PostRating.count(:group => 'post_id',
:order => 'count(*) desc',
:conditions => { :agree => true },
:limit => 5)
Это вернет вам хеш, сопоставляющий идентификатор сообщения с количеством согласованных оценок. Затем вы можете использовать этот 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
в сообщениях, которые вы просматриваете, если хотите.