1

我對rails和sql都比較陌生。我在生產中使用postgres。如何獲得一組記錄的總和?

我有一個Like模型,並通過多態性,它有屬性likeable_typelikeable_id,這是怎麼在我的Photo模型的項目爲「喜歡」的用戶。我可以通過類似對象訪問照片,如like.likeable,當可贊同對象的Photolikeable_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 ---)) 

,但我不是很能推算正確的語法shoule是什麼。

任何幫助將非常感謝!

+0

換句話說,我期望做的是在過去的24小時內統計類似表中創建的每個likeable_id的數量。誰能幫忙? – alik

+0

任何提示也會有所幫助。真的需要弄清楚這一個,任何人都可以幫忙嗎? – alik

回答

0

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

+0

我不認爲這是正確的語法。它沒有工作 – alik

+0

我認爲'.first.likes'不適合 – alik

0

這裏有一個可能性:

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

這將產生SQL,看起來像(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 

,你會得到一個的ActiveSupport :: OrderedHash即{photo_id =>喜歡,photo_id_2 => likes}等

如果這不是多態的,並且Like是「belongs_to:photo」 - 你可以做一個.group(:photo)並且實際上有rails創建一個有序的{photo_object =>喜歡s} - 但是有一個多態關聯 - 根據我的知識,你不能做一個.group(:可愛) - 所以你必須遍歷整個hash並且做一個Photo.find(photo_id_from_hash),這可能不是全部這取決於有多少照片被喜歡,所以你可能不得不使用該ID列表 - 但至少,上面會給你的名單沒有太多的努力。

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