RoR пятерка лучших - PullRequest
       1

RoR пятерка лучших

0 голосов
/ 03 сентября 2010

У меня есть модель, у которой есть оценки для сообщения.

Я хочу отобразить список из 5 лучших оценок для данного сообщения, но я полностью потерян, с чего начать.Я полагаю, что метод find может иметь что-то полезное, но я не уверен.Я даже рассматривал циклическую обработку каждой записи, получая ее размер, добавляя ее в хеш, сортируя хеш и т. Д., Но это кажется слишком сложным.

Кто-нибудь знает, как я могу выполнить что-то подобное?1005 *

Спасибо

Редактировать: Я нашел это, чтобы получить все сообщения, которые имеют рейтинг согласия:

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

Единственная проблема в том, что я не могу понять, какчтобы получить пять лучших оценок по этому запросу.

Ответы [ 2 ]

1 голос
/ 03 сентября 2010

Возможно, стоит привести немного больше примера кода, с которым вы работаете, но я отвечу с несколькими предположениями.

Если у вас есть:

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 в сообщениях, которые вы просматриваете, если хотите.

0 голосов
/ 03 сентября 2010

Исходя из того же 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...