当没有logging时用()find()

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

user = User.find(10) 

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

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

我可以得到零,而不是提出exception,所以当我做这样的事情:

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

我只想在没有logging的情况下得到零,我不想使用开始/救援

谢谢

是的,只要:

 Challenge.find_by_id(10) 

对于Rails 4和5:

 Challenge.find_by(id: 10) 

在Rails 4中,dynamic查找器(例如在接受的答案中使用的find_by_id已被弃用。

向前走,你应该使用新的语法:

 Challenge.find_by id: 10 

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

这将返回零,而不是引发一个exception

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

你为什么不简单地赶上例外? 你的情况看起来像是例外情况:

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

如果你想从救援块中的错误中恢复(例如通过设置一个占位符用户(空模式)),你可以在这个块的下面继续你的代码。 否则,你可能会把所有的代码放在“开始”和“救援”之间的块中。

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

就像这样简单:

 user = User.find(10) rescue nil 

对于那些与mongoid挣扎的人来说 ,事实certificate, findfind_by方法都会引发exception – 无论你的rails版本如何!

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

因此,对于mongoid用户的解决scheme是令人厌恶的代码:

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

你可以使用find_by与必要的属性(在你的情况下的id),这将返回零,而不是给出错误,如果没有find给定的ID。

 user = Challenge.find_by_id(id_value) 

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

 user = Challenge.find_by id: id_value 

你也可以使用where,但是你必须知道在哪里返回一个活动的logging关系,有零个或多个logging,你需要先使用返回一个logging,否则返回零。

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