如果没有记录,则使用 nil 查找()

在我当前的 Rails 程序中,当我使用

 user = User.find(10)

当没有 ID = 10的用户时,我会有如下异常:

ActiveRecord::RecordNotFound: Couldn't find User with ID=10

我可以得到 null 而不是异常,这样当我执行如下操作时:

unless user = Challenge.find(10)
puts "some error msg"
end

我只想在没有记录的情况下得到 null,而不想使用 start/save

Thanks

55493 次浏览

是的,就这么做:

Challenge.find_by_id(10)

对于 Rails 4和 Rails 5:

Challenge.find_by(id: 10)

你可以试试这个 Challenge.exists?(10)

您可以使用 ActiveRecord 查询接口来完成这个操作。

这将返回 null,而不是引发 Exception

  User.where(:id => 10).first

在 Rails 4中,动态查找程序(例如在已接受的答案中使用的 find_by_id)被弃用。

接下来,您应该使用新的语法:

Challenge.find_by id: 10

你为什么不直接抓住这个例外呢? 你的情况看起来就像是为什么会有例外:

begin
user = User.find(10)
rescue ActiveRecord::RecordNotFound
puts "some error msg"
end

如果您想从救援块中的错误中恢复(例如,通过设置占位符用户(null 模式)) ,您可以继续使用该块下面的代码。否则,您可能会将“ Happy case”的所有代码放在“ start”和“ save”之间的区块中。

您可以将 find _ by 与必需的属性(在您的例子中是 id)一起使用,这将返回 nil,而不是在找不到给定的 id 时给出一个错误。

user = Challenge.find_by_id(id_value)

或者你可以使用新的格式:

user = Challenge.find_by id: id_value

您还可以使用 where,但是您必须知道,如果返回一个带有零个或多个记录的活动记录关系,那么您需要首先使用 where,以便在零个记录返回的情况下仅返回一个记录或零个记录。

user = Challenge.where(id: id_value).first

就像这么简单:

user = User.find(10) rescue nil

For those struggling with 蒙古人, it turns out that both find and find_by methods will raise exception - no matter your rails version!

有一个 选择(即 发现错误)可以设置为 false,但是当 falsey 使 find方法不引发异常以及。

因此,蒙古语使用者的解决方案是令人厌恶的代码:

User.where(id: 'your_id').first # argghhh