我对rails和sql都比较新。我正在使用postgres进行制作。
我有一个Like
模型,通过多态,它有likeable_type
和likeable_id
属性,这就是我的Photo
模型中的项目被用户“喜欢”的方式。当可感知对象的like.likeable
为Photo
且照片的ID为likeable_type
时,我也可以通过类似对象访问照片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 --- ))
但我无法确定正确的语法是什么。
任何帮助都将非常感谢!
答案 0 :(得分:2)
假设你有以下内容:
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
答案 1 :(得分:0)
如果我理解你的模特,可能会像Like.where(created_at: (1.days.ago.utc...Time.now), linkable_type: 'Photo').first.likes.sum(:something)
那样?
答案 2 :(得分:0)
这是一种可能性:
Like.where('created_at >= ?',Time.now - 1.day).where('likeable_type = ?','Photo').group('likeable_id').order('count_all DESC').count
这将产生看起来像(mysql)的sql:
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 =&gt;喜欢,photo_id_2 =&gt;喜欢等等。
如果那不是多态的,而且Like是“belongs_to:photo” - 你可以做一个.group(:photo)并且实际上有rails创建了一个有序的{photo_object =&gt;喜欢} - 但是有多态关联 - 你根本不能做.group(:likeable) - 所以你必须遍历哈希并做一个Photo.find(photo_id_from_hash),这可能不是全部效果取决于喜欢的照片数量,所以你可能不得不玩这个id列表 - 但至少,上面的内容会让你无需花费太多精力。