1
3

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 3 years have passed since last update.

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

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

1
3
2

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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?