当我使用
之类的东西时,在我当前的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
谢谢
答案 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 挣扎的人来说,事实证明find
和find_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