web-dev-qa-db-ja.com

レコードがない場合は、nilを指定してfind()

私の現在の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

レコードがなく、begin/rescueを使用したくないときに、nilを取得したいだけです。

ありがとう

87
Eqbal

はい、できます:

Challenge.find_by_id(10)

Rails 4および5:

Challenge.find_by(id: 10)
154
apneadiving

Rails 4、ダイナミックファインダ-受け入れられた回答で使用されたfind_by_idなど)は廃止されました。

今後は、新しい構文を使用する必要があります。

Challenge.find_by id: 10
30
hattila91

activeRecord Query Interfaceを使用するだけで、これを少しハックすることができます。

例外を発生させる代わりに、nilを返します

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

単に例外をキャッチしてみませんか?あなたのケースは、例外が何のために作られたかのように見えます:

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

レスキューブロックのエラーから回復する場合(プレースホルダーユーザー(nullパターン)を設定するなど)、このブロックの下でコードを続行できます。そうしないと、「begin」と「rescue」の間のブロックに「happy case」のすべてのコードを配置するだけで済みます。

5
morgler

これを試すことができますChallenge.exists?(10)

4
tonymarschall

mongoidと苦労している人にとって、findfind_byメソッドは例外を発生させます-Railsバージョン!

オプション (つまりraise_not_found_error)がありますが、これはfalseに設定できますが、falseyがfindメソッドを生成しない場合例外も。

したがって、mongoidユーザーの解決策は嫌なコードです:

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

次のように簡単です:

user = User.find(10) rescue nil
2
mohamed-ibrahim

Find_byを必須属性(あなたの場合はid)と共に使用すると、指定されたidが見つからない場合にエラーを返す代わりにnilを返します。

user = Challenge.find_by_id(id_value)

または、新しい形式を使用できます。

user = Challenge.find_by id: id_value

Whereを使用することもできますが、whereは0個以上のレコードを含むアクティブなレコードリレーションを返すことを知っている必要があります。

user = Challenge.where(id: id_value).first
0
Alanoud Just