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>