脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

Rails(ActiveRecord)に関して

Active Recordの値の取り扱いに関して

こんなレコードがあるとして

mysql> select id,name from users;
+----+---------+
| id | name    |
+----+---------+
|  1 | foo     |
|  2 | bar     |
|  3 | fizz    |
+----+---------+

これをActiveRecord経由で取得した場合どういうデータ形式になったりメソッドが使えるかという話

find_byだと

Userインスタンスが返ってくる
> User.select(:id, :name).find_by(id: 1)
=> #<User id: 1, name: "foo">
それぞれの値の取得方法
> user = User.select(:id, :name).find_by(id: 1)
=> #<User id: 1, name: "foo">

> user.id
=> 1
> user.name
=> "foo"

> user[:id]
=> 1
> user[:name]
=> "foo"
to_aメソッドやeachは使えない
> User.select(:id, :name).find_by(id: 1).to_a
Traceback (most recent call last):
        9: from script/rails:8:in `<main>'
        8: from script/rails:8:in `require'
        .
        .
        .

whereの場合

ActiveRecord::Relationが返ってくる
# ActiveRecord::Relationとして返ってくる
> User.select(:id, :name).where(id: [1,3])
=> #<ActiveRecord::Relation [#<User id: 1, name: "foo">, #<User id: 3, name: "fizz">]>
> User.select(:id, :name).where(id: [1,3]).class
=> User::ActiveRecord_Relation

# to_aにすると配列として返ってくる
> User.select(:id, :name).where(id: [1,3]).to_a
=> [#<User id: 1, name: "foo">, #<User id: 3, name: "fizz">]
irb(main):315:0> User.select(:id, :name).where(id: [1,3]).to_a.class
=> Array
それぞれの値の取得方法
# 配列のように指定ができる
> User.select(:id, :name).where(id: [1,3])[0]
=> #<User id: 1, name: "foo">
> User.select(:id, :name).where(id: [1,3])[1]
=> #<User id: 3, name: "fizz">

# その上で値が取得できる
> User.select(:id, :name).where(id: [1,3])[0].name
=> "foo"
> User.select(:id, :name).where(id: [1,3])[1].name
=> "fizz"
ActiveRecord::Relationでも配列でもeachが使える(取得できるのはuserインスタンス)
# ActiveRecord::Relation
> User.select(:id, :name).where(id: [1,3]).each do |user|
>     puts user
> end
#<User:0x00005560a6bd4d20>
#<User:0x00005560a6bd46b8>

# Array
> User.select(:id, :name).where(id: [1,3]).to_a.each do |user|
>     puts user
> end
#<User:0x00005560a6b3aef0>
#<User:0x00005560a6b3a6a8>