您可以采用几种方法,在速度、易用性等方面进行各种权衡。我假设您的用户模型有has_many :likes
关联。
你可以做类似的事情
current_user.likes.where(:likeable_type => 'Photo', :likeable_id => photo).exists?
尽管这会为每张显示的照片触发一个数据库查询(尽管只要您在 likes 表上有正确的索引,它们将是非常快速的查询)。
另一种选择是一次性加载所有喜欢的用户,并将它们放入由 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]