我有这样的多态性:
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。
答案 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]
的值