1

私は比較的新しいレールですが、SQLもあります。私は生産時にポストグルを使用しています。レコードグループの合計を取得するには?

私はLikeモデルを持っているとポリモーフィズムを通じて、それはlikeable_typelikeable_id属性ました、これは私のPhotoモデル内のアイテムがユーザーによって「好かれる」方法です。好きなオブジェクトがlikeable_typeとしてPhoto、写真の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

ヒントも参考になります。本当にこの1つを理解する必要があります、誰も助けることができますか? – 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 

これは(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のを取得します:: {photo_id =>好きですOrderedHashは、 、photo_id_2 => likes}など

多態性ではなく、Likeは "belongs_to:photo"でした。あなたは.group(:photo)を行い、実際には、{photo_object =>好き私の知る限り.group(:好き)はできないので、ハッシュをループして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 
関連する問題