如何从照片集中查看current_user喜欢哪张照片?

时间:2012-05-20 16:40:47

标签: ruby-on-rails

我有这样的多态性:

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

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

在照片#index视图中,我每页显示10张照片(有喜欢计数和喜欢的按钮)。我想检查current_user喜欢哪张照片,以及是否喜欢禁用“喜欢按钮”。怎么做,最好的方法是什么?

祝你好运, 的Georgi。

2 个答案:

答案 0 :(得分:0)

喜欢belongs_to:用户 photo.likes.detect {| l | l.user_id == current_user.id}

答案 1 :(得分:0)

您可以采用多种方式,在速度,易用性等方面进行各种权衡。我假设您的用户模型具有has_many :likes关联。

您可以执行类似

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

虽然这会显示每张照片的一个数据库查询(虽然只要你在相似的表上有正确的索引,它们将是非常快的查询。)

另一种选择是一次加载所有喜欢的用户,并将它们放入由likeable_id和likeable_type索引的哈希中。这只需要每页一个查询,但如果用户有很多喜欢,则会变慢 - 你可以加载3000个喜欢只是为了确定你正在显示的照片的状态

另一种选择是仅加载您正在显示的照片的喜欢。如果该数组是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]的值