当没有记录时,使用nil查找()

时间:2012-03-07 15:46:05

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

当我使用

之类的东西时,在我当前的rails程序中
 user = User.find(10)

当没有ID = 10的用户时,我会有例外情况:

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

我可以获得nil而不是引发异常,所以当我做类似的事情时:

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

我只想在没有记录的情况下获得nil并且我不想使用begin / rescue

谢谢

8 个答案:

答案 0 :(得分:147)

是的,只是这样做:

Challenge.find_by_id(10)

对于Rails 4和5:

Challenge.find_by(id: 10)

答案 1 :(得分:30)

在Rails 4中,不推荐使用动态查找程序 - 例如在接受的答案中使用的find_by_id

继续前进,您应该使用新语法:

Challenge.find_by id: 10

答案 2 :(得分:14)

你可以做一点hackish,只需使用ActiveRecord查询接口。

这将返回nil,而不是引发异常

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

答案 3 :(得分:5)

为什么不简单地捕获异常?您的案例与以下内容完全相同:

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

如果要从rescue块中的错误中恢复(例如,通过设置占位符用户(空模式)),可以继续使用此块下面的代码。否则你可能只是把所有代码放在“开始”和“救援”之间的块中的“快乐案例”。

答案 4 :(得分:4)

您可以尝试此Challenge.exists?(10)

答案 5 :(得分:3)

对于那些与 mongoid 挣扎的人来说,事实证明findfind_by方法都会引发异常 - 无论你的rails版本是什么!

有一个option(即 raise_not_found_error )可以设置为false,但是当falsey使find方法也不能引发异常时。

因此,mongoid用户的解决方案是恶心的代码:

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

答案 6 :(得分:2)

就像:

一样简单
user = User.find(10) rescue nil

答案 7 :(得分:0)

你可以使用find_by和必需的属性(在你的情况下为id),如果找不到给定的id,这将返回nil而不是给出错误。

user = Challenge.find_by_id(id_value)

或者您可以使用新格式:

user = Challenge.find_by id: id_value

您也可以使用where,但您必须知道返回与零个或多个记录的活动记录关系的位置,您需要先使用它来返回一个记录,如果零记录返回则需要nil。

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