可能重复:
Model.find(1) gives ActiveRecord error when id 1 does not exist
如果数据库中没有id为1的用户,则尝试User.find(1)
将引发异常。
为什么会这样?
答案 0 :(得分:199)
因为这就是架构师想要找到(id)的方式,如RDoc中所示:
按id查找 - 这可以是特定的id(1),id列表(1,5,6),也可以是id数组([5,6,10])。如果找不到所有列出的ID的记录,则会引发RecordNotFound。
如果您不想引发异常,请使用find_by_id,如果找不到具有指定id的对象,则返回nil。那么您的示例就是User.find_by_id(1)
。
答案 1 :(得分:-4)
除了runako的解释之外,选择是否引发异常实际上非常有用。我正在开发一个博客应用程序,我想添加对查看下一个或上一个博客条目的支持。我能够在我的Post
模型中添加两个实例方法,当您在查看第一篇文章时尝试获取上一篇文章时返回nil
,或者在查看最后一篇文章时查看下一篇文章:
def next
Post.find_by_id(id + 1)
end
def previous
Post.find_by_id(id - 1)
end
这可以避免我的帮助程序代码有条件地生成Previous Post / Next Post链接,因为它必须处理RecordNotFound
异常,这会很糟糕,因为它会使用控制流的异常。