1

私はrailsとsqlに比較的慣れていません。私は本番環境でpostgresを使用しています。

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

しかし、正しい構文が何であるかを完全に理解することはできません。

どんな助けでも大歓迎です!

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

1 つの可能性を次に示します。

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 

{photo_id => likes, photo_id_2 => likes} などの ActiveSupport::OrderedHash を取得します。

それがポリモーフィックではなく、Like が「belongs_to :photo」だった場合 - .group(:photo) を実行して、実際に Rails に {photo_object => likes} の順序付けられた has を作成させることができますが、ポリモーフィックな関連付けを使用すると、私の知る限り、.group(:likeable) を実行することはできません。そのため、ハッシュをループして Photo.find(photo_id_from_hash) を実行する必要があります。これは、いいねされた写真の数によっては、それほど効率的ではない可能性があります。 、そのため、その id のリストをいじる必要があるかもしれませんが、少なくとも、上記の方法でそれほど労力をかけずにリストを取得できます。

于 2011-11-25T21:13:35.550 に答える