如何获得一组记录的总和?

时间:2011-11-10 12:09:06

标签: mysql ruby-on-rails postgresql ruby-on-rails-3.1 rails-postgresql

我对rails和sql都比较新。我正在使用postgres进行制作。

我有一个Like模型,通过多态,它有likeable_typelikeable_id属性,这就是我的Photo模型中的项目被用户“喜欢”的方式。当可感知对象的like.likeablePhoto且照片的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 --- ))

但我无法确定正确的语法是什么。

任何帮助都将非常感谢!

3 个答案:

答案 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列表 - 但至少,上面的内容会让你无需花费太多精力。