こんにちは。18歳女子高生ながらエンジニアとしていろいろな会社でアルバイトをしている7cocoです。
ActiveRecord の where句のあと思うように値が取り出せない!
という事態に先日はまりました。
クエリが違うのかなと思いながらいじっていると、「where
を find
に変更すると値が取り出せるようになる」ことに気づきました。
どうして?
find
と where
の違い
find:オブジェクトを一つ返す
where:オブジェクトを配列で返す ※これは厳密には間違いです。追記参照。
where
は配列を返すので、その中のオブジェクトの中の値を直接取り出すことはできません。
# 以下は動きますが
User.find(1).email
# こちらは動きません。
User.where(id: 1).email
where
に find
と同じような動きをさせたい場合には first
をつけたりして where
句で返された配列の中からどのオブジェクトにメソッドを繋げるのか明示しましょう。
# これは動く!
User.where(id: 1).first.name
追記
と思っていたのですが厳密には違うようです。
ActiveRecord_Relation
where
が返すのは配列ではなく、 ActiveRecord_Relation
というものです。
※ (ActiveRecord_Relation
について勉強してみたものをこちらにまとめています。http://qiita.com/7coco/items/2e3a9e720d29791f1cfc)
user = User.where(id: 1)
user.class
=> User::ActiveRecord_Relation
こんな挙動、使い方
- 配列にしかないメソッドをチェインすると、レシーバを自動的に配列に変えて実行します。
- 配列にはないメソッドがいろいろとあります ( 例えば
where
をさらに繋げられます)。 - 配列にも
ActiveRecord_Relation
にもあるメソッドで、配列のものを呼び出したい場合など、確実に配列のメソッドを呼び出したいときはto_a
して配列にしてから呼び出すといいみたいです。