2017-08-18 3 views
0

がデータベースに存在するが、2のIDを持つアイテムがない場合、次の行:すべてのレコードが見つからない場合、ActiveRecord :: RecordNotFoundを生成する方法は? 1のIDとその項目を考える

Item.find([1, 2]) 

ActiveRecord::RecordNotFoundエラーが発生します。ただし、次の行ではないでしょう:

Item.where(id: [1, 2]) 

代わりに、それはちょうど1のIDを持つアイテムを返します。私は一意の値を照会していた場合wherefindの行動を強制する方法はあります。

idとは別に、uid文字列属性も持つモデルFooがあります。各fooには一意のuid値があります。だからuidsの配列を与えられた場合、uidの値のいずれかがfooが存在しない場合、すべてfoosをフェッチするか、エラーを発生させたいと思います。

P.S.私はraise ActiveRecord::RecordNotFound unless query_result.count == uids.countのようなことをすることができましたが、もっと良いアプローチがあるかどうかを知りたいと思います。

答えて

1

を試す行うことができます。

ソースコードを確認したところ、は、同じトリックを使用してRecordNotFound例外を発生させます。例外は、渡された配列から特定のIDを見つけることができません。 (渡されたIDS配列のサイズに対する結果のサイズと一致) はhereを呼び出すfind方法を呼び、彼らは、私はあなただけの `のActiveRecordを上げることができると思い例外here

+0

ありがとう、@ alok-swain、ソースでも場所を見つけようとしましたが、実行チェーンを追跡できませんでした。これは本当に私を助けました。 –

0

ここでActiveRecord::RecordNotFoundエラーを発生させたい場合。 ActiveRecord#whereはこのエラーを発生させないので、ActiveRecord#findメソッドを使用する必要があります。

私はあなたがActiveRecord#findを使うべきだと思うが、私は(だけではなく、実際のARオブジェクトの関係を返す)whereと、そのような規定がイマイチだと思う

ids = [1,2,3,4,5] 
foo = Foo.where(id: ids) 
a = foo.pluck(:id) 
raise ActiveRecord::RecordNotFound if ids!=a 
+0

を上げる場所:: RecordNotFound foo.size < ids.size' –

+0

はいこれもできます –

+0

@ ankur-pohekar 'find'はIDのみで動作し、idのように一意ですが主キーではない属性をクエリしています。したがって、私は 'where'しか使うことができません。 –

関連する問題