0

我有这样的多态关联:

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

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

在照片#index 视图中,我每页显示 10 张照片(带有点赞数和点赞按钮)。我想检查当前用户喜欢哪张照片,以及是否喜欢禁用“点赞按钮”。如何做到这一点,最好的方法是什么?

最好的问候,乔治。

4

2 回答 2

0

Likes 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?

尽管这会为每张显示的照片触发一个数据库查询(尽管只要您在 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]

于 2012-05-20T18:19:35.920 回答