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

Eqb*_*bal 88 ruby activerecord ruby-on-rails ruby-on-rails-3

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

 user = User.find(10)
Run Code Online (Sandbox Code Playgroud)

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

ActiveRecord::RecordNotFound: Couldn't find User with ID=10
Run Code Online (Sandbox Code Playgroud)

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

unless user = Challenge.find(10)
  puts "some error msg"         
end
Run Code Online (Sandbox Code Playgroud)

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

谢谢

apn*_*ing 157

是的,只是这样做:

Challenge.find_by_id(10)
Run Code Online (Sandbox Code Playgroud)

对于Rails 4和5:

Challenge.find_by(id: 10)
Run Code Online (Sandbox Code Playgroud)

  • 奇!我永远不会猜到`.find_by_*`会返回nil而`.find`会不会. (9认同)

hat*_*a91 30

在Rails 4中,动态查找程序 - 例如find_by_id在已接受的答案中使用的 - 已被弃用.

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

Challenge.find_by id: 10
Run Code Online (Sandbox Code Playgroud)

  • 如果其他人像我一样对此感到困惑:`Challenge.find_by(id:10)`是写这个的另一种方式 (4认同)

bea*_*nie 14

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

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

  User.where(:id => 10).first
Run Code Online (Sandbox Code Playgroud)

  • 实际上`find_by _...`会做正确的事情:) (2认同)

mor*_*ler 5

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

begin
  user = User.find(10)
rescue ActiveRecord::RecordNotFound
  puts "some error msg"
end
Run Code Online (Sandbox Code Playgroud)

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