关于rails上的ruby:当没有记录时,find()使用nil

find() with nil when there are no records

在我当前的rails程序中,当我使用类似的东西

1
 user = User.find(10)

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

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

我可以获得nil而不是提出异常,所以当我做以下事情时:

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

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

谢谢


是的,只是这样做:

1
Challenge.find_by_id(10)

对于Rails 4和5:

1
Challenge.find_by(id: 10)


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

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

1
Challenge.find_by id: 10


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

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

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


你为什么不简单地抓住异常?您的案例看起来与以下内容完全相同:

1
2
3
4
5
begin
  user = User.find(10)
rescue ActiveRecord::RecordNotFound
  puts"some error msg"
end

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


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


对于那些与mongoid斗争的人来说,无论你的rails版本如何,findfind_by方法都会引发异常!

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

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

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


就像这样简单:

1
user = User.find(10) rescue nil


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

1
user = Challenge.find_by_id(id_value)

或者您可以使用新格式:

1
user = Challenge.find_by id: id_value

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

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