快速提问。
我有一个具有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
我知道这不是最有效的方法。
做这样的事情的正确方法是什么?
谢谢!
答案 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