我有一个模型Post
,其中有一个名为is_viewed
的字段,在创建Post
时为false。
向用户显示帖子时,将is_viewed
设置为true的最佳方法是什么?
目前,我必须这样做:
class PostsController..
def show
#find the post
@post = current_user.posts.find(params[:id])
if !@post.is_viewed?
#mark as viewed
@post.update_attribute(:is_viewed, true)
#find the post (again)
@post = current_user.posts.find(params[:id])
end
end
end
为了只加载一次帖子,我可以这样做:
if !@post.viewed?
if @post.update_attribute(:is_viewed, true)
#simply update the viewed to true, "in memory" so that
#the view's erb can use the correct value of the "is_viewed" variable
@post.viewed = true
end
end
但这是正确的做法吗?
答案 0 :(得分:3)
你的红宝石不是很红宝石。通常,不会使用'is_'作为前缀,因为ruby允许方法名称以问号结尾。假设您的字段是布尔值,您可以使用@post.viewed?
作为简写。
无论如何回答你的问题,因为ActiveRecord :: Dirty,真的没有必要检查当前的状态。如果您在@post.save
为false的帖子上调用@post.changed?
,则不会运行更新查询。所以:
@post = current_user.posts.find(params[:id])
@post.viewed = true
@post.save
你没有说为什么你的代码重新加载帖子所以我会认为这是假的。 Ruby有unless
个关键字,因此您可以将if !expr
等结构替换为unless expr
。
此外,ruby代码看起来最好缩进2个空格: - )