1

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

我有一个Like模型,通过多态性,它具有属性likeable_typelikeable_id这就是我的Photo模型中的项目如何被用户“喜欢”的方式。我也可以通过类似的对象访问照片,就像like.likeable当喜欢的对象具有Photoaslikeable_type和照片的 id 一样时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 --- ))

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

任何帮助将不胜感激!

4

3 回答 3

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
于 2011-11-27T06:45:08.553 回答
0

可能是这样的Like.where(created_at: (1.days.ago.utc...Time.now), linkable_type: 'Photo').first.likes.sum(:something),如果我正确理解你的模型?

于 2011-11-10T12:13:21.330 回答
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 => likes, photo_id_2 => likes} 等。

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

于 2011-11-25T21:13:35.550 回答