0

私はこのような多形の関連付けを持っています:

class Likes < ActiveRecord::Base  
  belongs_to :likeable, :polymorphic => true  
end

class Photos < ActiveRecord::Base  
  has_many :likes, :as => :likeable
end

photos#indexビューでは、ページごとに10枚の写真(いいねカウントといいねボタン付き)を表示しています。current_userがどの写真を高く評価しているか、「いいねボタン」を無効にするのが好きかどうかを確認したいと思います。これを行う方法と最良の方法は何ですか?

よろしく、ゲオルギ。

4

2 に答える 2

0

いいねbelongs_to:user photo.likes.detect {| l | l.user_id == current_user.id}

于 2012-05-20T17:22:53.937 に答える
0

速度や使いやすさなど、さまざまなトレードオフがあり、いくつかの方法があります。ユーザーモデルにはhas_many :likes関連性があると思います。

あなたは次のようなことをすることができます

current_user.likes.where(:likeable_type => 'Photo', :likeable_id => photo).exists?

これにより、表示された写真ごとに1つのdbクエリが実行されます(ただし、likesテーブルに適切なインデックスがある限り、非常に高速なクエリになります)。

もう1つのオプションは、すべてのユーザーのいいねを一度にロードし、likeable_idとlikeable_typeでインデックス付けされたハッシュに入れることです。これにはページごとに1つのクエリしか必要ありませんが、ユーザーがいいねをたくさん持っている場合は遅くなります-表示している写真のステータスを確認するためだけに3000のいいねをロードすることができます

もう1つのオプションは、表示している写真のいいねだけを読み込むことです。その配列があれば、photosあなたはできる

likes = current_user.likes.where(:likeable_type => 'Photo', :likeable_id => photos)

これにより、単一のクエリが高速になり(ここでも、適切なインデックスがあると仮定して)、必要以上にいいねを取得することはありません。

liked = likes.inject({}) {|hash,like| hash[like.likeable_id]=true; hash}

次に、写真(IDで識別される)が高く評価されたかどうかを示すハッシュを提供します。liked[photo.id]

于 2012-05-20T18:19:35.920 に答える