(рельсы) Порядок по количеству лайков на сайте - PullRequest
2 голосов
/ 31 мая 2011

У меня есть модель под названием веб-сайты has_many :likes, и, конечно, другая модель называется лайками с belongs_to :website.Я хочу получить массив всех веб-сайтов, но упорядочить их по количеству лайков, которые есть у веб-сайта.

полезная информация:

Я настроил его, поэтому @website.likes вернет лайкиот @website.(@website.likes.count - это количество лайков на сайте)

Я хочу получить массив всех веб-сайтов, но упорядочить их по количеству лайков на сайте.

Ответы [ 3 ]

5 голосов
/ 31 мая 2011

Как уже сообщали другие, вы можете присоединиться к likes, а затем заказать по количеству.Производительность может быть немного занижена в зависимости от индексации и т. Д. У вас будет немного другой синтаксис в зависимости от того, используете ли вы Rails 2 или 3.

Альтернативой может быть сохранение денормализованного столбца likes_count в websites, который обновляется при сохранении объекта модели Like.

Затем вам нужно просто запросить Website и указать порядок likes_count по убыванию (и легко индексируется).

Для этого создайте целочисленный столбец likes_count в websites и укажите параметр :counter_cache в объявлении belongs_to в модели Likes.Например:

class Likes
  belongs_to :website, :counter_cache => true
end

Проверьте http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html для получения дополнительной информации

2 голосов
/ 31 мая 2011

Этот запрос должен дать вам то, что вам нужно:

all(:select => 'websites.*, count(*) as count',
  :joins => :likes,
  :group => :websites,
  :order => 'count DESC')
0 голосов
/ 31 мая 2011

Что-то вроде:

SELECT Websites.*, COUNT(Like.ID) AS Liked
FROM websites
    LEFT OUTER JOIN Like ON websites.ID = Like.website_id
GROUP BY Like.website_id ORDER BY Liked DESC
...