最有效的活动记录查询,看看记录是否是最喜欢的?

时间:2015-08-30 01:35:39

标签: ruby-on-rails ruby activerecord

快速提问。

我有一个具有Book模型的rails应用程序。

我也有“最爱”和“评级”模式。

每本书都可以被用户收藏,用户可以对该书进行评分。

每次书籍被收藏或评级时,都会创建新的收藏夹或评级活动记录条目。

因此,如果我在索引视图中列出所有书籍,我希望Book模型上有一个is_favorited attribue,以查看当前登录的用户是否喜欢它...就像这样

class book




  def favorite
    isFavorite = false
    if User.current_user
      favorite = Favorite.where(:attraction_id => self.id, :user_id => User.current_user.id)
      if favorite.length > 0
        isFavorite = true
      else
        isFavorite = false
      end
    end

    return isFavorite
  end
end  

我知道这不是最有效的方法。

做这样的事情的正确方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

无关,但此代码:

  def favorite
    isFavorite = false
    if User.current_user
      favorite = Favorite.where(:attraction_id => self.id, :user_id => User.current_user.id)
      if favorite.length > 0
        isFavorite = true
      else
        isFavorite = false
      end
    end

    return isFavorite
  end

可能更好地表达为:

  def favorite
    return false unless User.current_user

    favorites = Favorite.where(attraction_id: self.id, user_id: User.current_user.id)
    favorites.length > 0
  end

答案 1 :(得分:0)

您的代码现在所做的是从数据库中检索所有收藏夹,然后返回数组的长度。最好只询问count,以便查询立即返回收藏的数量。

此外,只需将用户作为参数传递给代码就可以更加清晰。所以像这样:

class book

  def favorited_by(user)
    return false if user.nil?

    Favorite.where(:attraction_id => self.id, :user_id => user.id).count > 0
  end

end

现在,我更喜欢写这个,是使用关联,出于某种原因你的外键被称为attraction_id,所以假设这不是一个多态关联,你可以写:

has_many :favorites, foreign_key: :attraction_id 

然后代码变得更清晰:

favorites.where(user_id: user.id).count > 0