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中,不推荐使用动态查找程序 - 例如在接受的答案中使用的
继续,您应该使用新语法:
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 |
如果要从救援块中的错误中恢复(例如,通过设置占位符用户(空模式)),您可以继续使用此块下面的代码。否则,您可能只需将"快乐案例"的所有代码放在"开始"和"救援"之间的块中。
你可以试试这个
对于那些与mongoid斗争的人来说,无论你的rails版本如何,
有一个选项(即raise_not_found_error)可以设置为false,但是当falsey使
因此,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 |