2012-03-08 12 views
8

idを持つfindを呼び出すと、それはターゲットのfindになり、エラーRecordNotFoundがスローされます。RecordNotFoundを発生させる 'find'または 'where'を発行するには

Foo::Bar.find(123) # RecordNotFound if no Bar with id 123 exists. 

しかし、私は見つからなかった場合の条件で、私はnilを取得することを呼び出します。

Foo::Bar.find(:first, :conditions => [ "lower(name) = ?", name.downcase ]) 

私もエラーを発生させるために、このような条件検索をしたいです。私は私ができることを知っています:

Foo::Bar.find_by_name!("CocktailBar") #=> raises Recordnotfount if not not found. 

しかし、それは本当に単純な条件があります。私のものはもう少し複雑です。実際には次のようになります。

Foo.Bar.select{ |pm| pm.name.downcase =~ /cocktail/}.first 

そして、何も見つからない場合は、RecordNotFoundエラーを発生させます。それはまったく可能ですか?または、単にnilに対してチェックするコードを追加する必要がありますか?とnilなら?自分自身でエラーを起こす?もしそうなら、それをRails 3でどうすればいいですか?

答えて

3

あなたの最後の段落はあなたがする必要があります。 nilに対してチェックするか、例外を自分で発生させます。例外を自分で調達するには、次の手順を実行します。

Foo::Bar.find(:first, :conditions => [ "lower(name) = ?", name.downcase ]) || raise(ActiveRecord::RecordNotFound) 
41

コードの最後のスニペットでは、あなたが実際にDBからのすべてのレコードをフェッチして、Rubyの配列にselectを行っています。 ActiveRecordとは関係がないため、手動で例外を発生させたい場合は、Douglasのコードを使用してください。ifまたはunlessなどですが、コードが何をしているのかは分かりません。 select {...}はSQL SELECT ... WHERE(...)に翻訳されていません。あなたはActiveRecordクエリによって自動的に発生した例外が必要な場合は

、これを使用します!

Foo::Bar.where([ "lower(name) = ?", name.downcase ]).first! 

+3

は '最初のを知っていたことはありませんFoo::Bar.find_by_name!(name)例えば方法は、同様find_by法のために存在する同等の強打、'方法、それに言及してくれてありがとう。 – bricker

+0

@lulalala私の答えを延長してくれてありがとう。私は 'find_by'メソッドについては気にしませんでした。なぜなら、質問の著者は明示的に彼がそれらを知っていると言っていて、質問はこれに関するものではないからです。 – RocketR

+0

@RocketR私はちょうど今述べたところでそれを実現しました。私は質問のタイトルに集中していたと思う。 – lulalala

関連する問題