【发布时间】:2023-04-07 16:07:01
【问题描述】:
可能重复:
Model.find(1) gives ActiveRecord error when id 1 does not exist
如果数据库中没有 id 为 1 的用户,尝试User.find(1) 将引发异常。
这是为什么?
【问题讨论】:
标签: ruby-on-rails activerecord
可能重复:
Model.find(1) gives ActiveRecord error when id 1 does not exist
如果数据库中没有 id 为 1 的用户,尝试User.find(1) 将引发异常。
这是为什么?
【问题讨论】:
标签: ruby-on-rails activerecord
因为这是架构师希望 find(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)。
【讨论】:
find_by_id(1) 确实已被弃用。但你可以使用find_by(id: 1)。
在 runako 的解释中,选择是否引发异常实际上非常有用。我正在开发一个博客应用程序,我想添加对查看下一个或上一个博客条目的支持。我能够向我的 Post 模型添加两个实例方法,当您在查看第一篇文章时尝试获取上一篇文章或查看最后一篇文章时尝试获取下一篇文章时,它们只会返回 nil:
def next
Post.find_by_id(id + 1)
end
def previous
Post.find_by_id(id - 1)
end
这避免了有条件地生成上一篇文章/下一篇文章链接的帮助程序代码必须处理 RecordNotFound 异常,这会很糟糕,因为它将使用异常进行控制流。
【讨论】:
Post 从数据库中删除?