Как получить сумму группы записей? - PullRequest
1 голос
/ 10 ноября 2011

Я относительно новичок в рельсах, а также sql. Я использую Postgres на производстве.

У меня есть модель Like, и благодаря полиморфизму она имеет атрибуты likeable_type и likeable_id, вот как элементы в моей модели Photo "нравятся" пользователю. Я могу получить доступ к фотографии через похожий объект, например, like.likeable, если у симпатичного объекта likeable_type - *1009*, а идентификатор фотографии - likeable_id.

.

Мой вопрос: я хочу получить список фотографий, которые понравились больше всего за последние 24 часа, с наиболее понравившейся вверху и наименее понравившейся внизу в заказе. Как мне это сделать?

Пока я знаю, что мой код должен выглядеть примерно так:

likes = Like.find(:all, :conditions => { :created_at => 1.days.ago.utc...Time.now.utc, :likeable_type => "Photo" })
likes = likes.group( --- something here --- , SUM( --- something here --- ))

но я не совсем могу понять, каким будет правильный синтаксис.

любая помощь будет очень ценится!

Ответы [ 3 ]

2 голосов
/ 27 ноября 2011

Если у вас есть следующее:

class Photo < AR::Base
  has_many :likes, :as => :likeable
end


class Like < AR::Base
  belongs_to :likeable, :polymorphic => true
end

Попробуйте:

@photos = Photo.select("photos.*, count(likes.id) AS likes_count").joins(:likes).where('likes.created_at > ?', 1.day.ago).group('photos.id').order('likes_count DESC')

Это также позволяет вам получить доступ к количеству лайков на каждой фотографии:

@photo.first[:likes_count] # => 4
0 голосов
/ 26 ноября 2011

Вот одна из возможностей:

Like.where('created_at >= ?',Time.now - 1.day).where('likeable_type = ?','Photo').group('likeable_id').order('count_all DESC').count

Это создаст sql, который выглядит как (mysql):

SELECT COUNT(*)    AS count_all, 
       likeable_id AS likeable_id 
FROM   `likes` 
WHERE  ( created_at >= '2011-11-24 20:43:19' ) 
       AND ( likeable_type = 'Photo' ) 
GROUP  BY likeable_id 
ORDER  BY count_all DESC 

, и вы получите ActiveSupport :: OrderedHash, то есть {photo_id=> лайки, photo_id_2 => лайки} и т. д.

Если это не было полиморфным, а Лайк был "own_to: photo" - вы могли бы создать группу .group (: photo) и на самом деле иметь рельсы для созданияупорядоченный имеет {photo_object => likes} - но с полиморфной ассоциацией - вы не можете создать .group (: likeable), насколько мне известно, - поэтому вам придется перебрать хеш и выполнить Photo.find (photo_id_from_hash), что может быть не столь эффективным, в зависимости от того, сколько фотографий вам понравилось, поэтому вам, возможно, придется поиграться с этим списком идентификаторов - но, по крайней мере, вышеизложенное поможет вам получить этот список без особых усилий.

0 голосов
/ 10 ноября 2011

Может быть что-то вроде Like.where(created_at: (1.days.ago.utc...Time.now), linkable_type: 'Photo').first.likes.sum(:something), если я правильно понимаю ваши модели?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...