単一のオブジェクトから持ってくる方法と、
オブジェクトが配列に入っていて、その配列の中から一個一個とりだす方法を紹介します。
1.単一のオブジェクトからデータをもってくる方法
2.オブジェクトが配列に入っているときに、欲しいデータだけをもってくる方法
1.単一のオブジェクトからデータをもってくる方法
# まず、インスタンスを取得
@user = User.find(2)
# @userの中身を確認
@user
=> #<User id: 2, email: "admin1@example.com", last_name: "admin", first_name: "user1", created_at: "2021-08-19 05:52:42", updated_at: "2021-08-19 05:52:42", deleted_at: nil>
この中から欲しいデータだけを取得したいとき
user.last_name
=> admin
ActiveRecord::Baseを継承したクラスはテーブルの構造を読み取り、自動でgetter,setterを作成する。そのため、カラム名をそのままgetter,setterとして利用ができる
userがリレーションを組んでいて、リレーション先のテーブルからデータを持ってきたいときも同じ
user.post.title
=> "今日の晩ごはん"
値はとれるけど、ActiveRecord的に自然ではないデータのとり方
user[:last_name]
=> admin
user.post[:title]
=> "今日の晩ごはん"
2.オブジェクトが配列に入っているときに、欲しいデータだけをもってくる方法
# まずインスタンスを取得
post = Post.find(2)
# postの中身を確認
[28] pry(main)> post
=> #<AssetMaster:0x000055766365a3e0
id: 2,
name: "今日の朝ごはん",
post_image: 1,
created_at: Thu, 19 Aug 2021 14:52:29 JST +09:00,
updated_at: Thu, 19 Aug 2021 14:52:29 JST +09:00,
deleted_at: nil>
# このpostに紐付いたデータ(image_masters)が配列に入っている(配列の中にハッシュオブジェクトが3つはいっている)
[28] pry(main)> post.image_masters
=> [#<ImageMaster:0x0000557663c32218
id: 2,
name: "電子機器",
created_at: Thu, 19 Aug 2021 14:52:28 JST +09:00,
updated_at: Thu, 19 Aug 2021 14:52:28 JST +09:00,
deleted_at: nil>,
#<ImageMaster:0x0000557663cb85c0
id: 7,
name: "嗜好品",
created_at: Thu, 19 Aug 2021 14:52:28 JST +09:00,
updated_at: Thu, 19 Aug 2021 14:52:28 JST +09:00,
deleted_at: nil>,
#<ImageMaster:0x0000557663cb8430
id: 8,
name: "エンタメ",
created_at: Thu, 19 Aug 2021 14:52:28 JST +09:00,
updated_at: Thu, 19 Aug 2021 14:52:28 JST +09:00,
deleted_at: nil>]
この中から、ImageMasterのnameが配列で欲しい場合(電子機器,嗜好品,エンタメが配列でほしいとき)
post.image_masters.map(&:name)
=> ["電子機器", "嗜好品", "エンタメ"]
補足
このように任意のカラムの配列を取得する方法として「pluck」と「map」の二つのメソッドが存在する。
使い分けの方法は
DBから値を取得する場合には「pluck」、既にインスタンス化したオブジェクトから値を取得する場合は「map」
という使い分けが最適です。
詳しくはこちら
pluckとmap の違いを調査する