2011-11-06 9 views
5

私はを持っています。は、単一のオブジェクトを返すモデルで動作します。しかし、私はオブジェクトの表記法でそれを使用することはできません(オブジェクトが[0]にある配列を返すようです)。単一のレコード検索で配列が返されるのはなぜですか? (レールの初心者)

store = Store.where("some_id = ?", some_id) 

puts store.name # doesn't work 

puts store # shows array with the object at [0] 

答えて

10

クエリが返すオブジェクトの数がわからないことがあるので、一貫性のために常に配列を取得することがあります。あなたは、モデルの主なIDを探しているなら、あなたも(レールが取り扱うRecrodNotFoundの例外が発生します

store = Store.find(some_id) 

を使用することができ、単一のオブジェクトの使用に

store = Store.where("some_id = ?", some_id).first 

を取得するには

オブジェクトが見つからない場合はデフォルトで404となります)。

+0

どのように可能性が同等である

Store.find_by_some_id(some_id) 

もあります結果が返ってこないかどうかチェックしますか?これはうまくいかないようです: 'store store.name store.blank'以外の場合 – Hopstream

+1

何も見つからなければ' nil'を返します。 'store.nil? 'で確認できます。 –

+0

最後の愚かな質問Jakub ... '.where(" some_id =? "、some_id)' ...この作業のようなものをレールに書いておく方がいいですか? '.where(:some_id = > some_id) ' – Hopstream

0

whereの節は常に返され、arel objecはメソッド連鎖に使用できます。

したがって、where句のreturn文は常に配列です。

はヤクブ

5

により示唆されるようにあなたが

object.firstをしなければならない最初の要素にアクセスするためのダイナミックファインダは彼らが

Store.where(:some_id => some_id).first 
+0

注目すべき点は、動的なファインダ(find_by *以外)はRails 4でサポートされていないということです。 ソース:http://edgeguides.rubyonrails.org/4_0_release_notes.html#active-record-deprecations – GantMan

関連する問題