🚂

【Rails】配列の中のハッシュから値を取得する方法(map)

2021/08/27に公開

単一のオブジェクトから持ってくる方法と、
オブジェクトが配列に入っていて、その配列の中から一個一個とりだす方法を紹介します。

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 の違いを調査する

Discussion