63
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ActiveRecord の find と where の違い。

Last updated at Posted at 2017-02-27

こんにちは。18歳女子高生ながらエンジニアとしていろいろな会社でアルバイトをしている7cocoです。

ActiveRecord の where句のあと思うように値が取り出せない!

という事態に先日はまりました。
クエリが違うのかなと思いながらいじっていると、「wherefind に変更すると値が取り出せるようになる」ことに気づきました。

どうして?

findwhere の違い

find:オブジェクトを一つ返す
where:オブジェクトを配列で返す ※これは厳密には間違いです。追記参照。

where は配列を返すので、その中のオブジェクトの中の値を直接取り出すことはできません。

# 以下は動きますが
User.find(1).email
# こちらは動きません。
User.where(id: 1).email

wherefind と同じような動きをさせたい場合には 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 して配列にしてから呼び出すといいみたいです。
63
50
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
63
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?