1

Je suis relativement nouveau sur les rails et aussi sql. J'utilise postgres sur la production.Comment obtenir la somme d'un groupe de documents?

j'ai un modèle Like et par le polymorphisme, il a des attributs likeable_type et likeable_id, c'est comment les éléments dans mon modèle Photo sont « aimé » par l'utilisateur. Je peux accéder à une photo à travers un objet similaire aussi like.likeable lorsque l'objet attitré a Photo comme likeable_type et l'identifiant de la photo comme likeable_id.

Ma Question: Je veux être en mesure d'obtenir une liste de Photos qui ont été les plus appréciées au cours des dernières 24 heures, avec le plus aimé en haut et le moins aimé en bas de la commande. Comment puis-je faire cela?

Jusqu'à présent, je sais que mon code devrait ressembler à quelque chose comme

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 ---)) 

mais je ne suis pas tout à fait en mesure de comprendre ce que la syntaxe correcte shoule être.

toute aide sera très appréciée!

+0

En d'autres termes, ce que je cherche à faire est de compter combien de chaque likeable_id a été créé dans la table similaire, dans les dernières 24 heures. Quelqu'un peut-il aider? – alik

+0

Un indice sera également utile. Vraiment besoin de comprendre celui-ci, quelqu'un peut-il aider? – alik

Répondre

0

Peut-être quelque chose comme Like.where(created_at: (1.days.ago.utc...Time.now), linkable_type: 'Photo').first.likes.sum(:something), si je comprends bien vos modèles?

+0

Je ne pense pas que ce soit la syntaxe correcte. Cela n'a pas fonctionné. – alik

+0

Je pense que le '.premier.likes' ne convient pas bien – alik

0

est ici une possibilité:

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

Cela produira sql qui ressemble (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 

et vous obtiendrez un ActiveSupport :: OrderedHash qui est {photo_id => aime , photo_id_2 => aime} etc.

Si ce n'était pas polymorphe, et comme était un "appartient à: photo" - vous pourriez faire un groupe.: (photo) et en fait avoir des rails créer un a ordonné de {photo_object => comme s} - mais avec une association polymorphique - vous ne pouvez pas faire un .group (: sympathique) à ma connaissance - donc vous devrez faire une boucle dans le hachage et faire un Photo.find (photo_id_from_hash), qui pourrait ne pas être tout C'est efficace en fonction du nombre de photos qui ont été aimées, donc vous devrez peut-être jouer avec cette liste d'ID - mais à tout le moins, ce qui précède vous obtiendrez la liste sans trop d'effort.

2

En supposant que vous avez les éléments suivants:

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


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

Essayez:

@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') 

Cela vous permet également d'accéder au nombre de gens chaque photo a:

@photo.first[:likes_count] # => 4