【问题标题】:How to get the Sum of a Group of Records?如何获得一组记录的总和?
【发布时间】:2011-11-10 12:09:05
【问题描述】:

我对 Rails 和 sql 都比较陌生。我在生产中使用 postgres。

我有一个Like 模型,通过多态性,它具有likeable_typelikeable_id 属性,这就是我的Photo 模型中的项目被用户“喜欢”的方式。当喜欢的对象具有Photo 作为likeable_type 并且照片的ID 为likeable_id 时,我也可以通过like.likeable 的类似对象访问照片。

我的问题:我希望能够获得过去 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 --- ))

但我不太能弄清楚正确的语法应该是什么。

任何帮助将不胜感激!

【问题讨论】:

  • 换句话说,我要做的是计算在过去 24 小时内在 like 表中创建了每个 likeable_id 的数量。有人可以帮忙吗?
  • 任何提示也会有所帮助。真的需要解决这个问题,有人可以帮忙吗?

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


【解决方案1】:

假设你有以下几点:

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

【讨论】:

    【解决方案2】:

    如果我正确理解您的模型,可能类似于Like.where(created_at: (1.days.ago.utc...Time.now), linkable_type: 'Photo').first.likes.sum(:something)

    【讨论】:

    • 我认为.first.likes 不太合适
    【解决方案3】:

    这是一种可能性:

    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 => likes, photo_id_2 => likes} 等等。

    如果这不是多态的,并且 Like 是一个“belongs_to :photo” - 你可以做一个 .group(:photo) 并且实际上让 rails 创建一个有序的 {photo_object => likes} - 但具有多态关联 - 据我所知,你不能做一个 .group(:likeable) - 所以你必须遍历哈希并做一个 Photo.find(photo_id_from_hash),这可能不是那么有效,具体取决于照片的数量那些被喜欢的,所以你可能不得不玩弄那个 id 列表 - 但至少,上面的内容会让你毫不费力地得到这个列表。

    【讨论】:

      猜你喜欢
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      相关资源
      最近更新 更多