質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

4回答

4217閲覧

配列内にハッシュを作る方法を教えてください

lilywhite

総合スコア42

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1グッド

2クリップ

投稿2020/02/09 12:50

ruby

1 2array = [ 3 {name: hoge, age: 15}, 4 {name: fuga, age: 20}, 5] 6

上記のような複数のハッシュをもつ配列をeach文で作成したいです。

rails

1@user = User.all 2@user.each do |user| 3 array = [] 4 array << { 5 name: user.name, age: user.age 6 } 7end 8 9#=> [{{name: fuga, age: 20}]

このようなコードを書いたのですが、#=> [{{name: fuga, age: 20}] というように@userの最後尾のデータしか格納されていません。

初歩的な質問で申し訳ありませんがよろしくお願いいたします。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

複数のレコードを持つような変数の名前は複数形を使うようにしましょう。
変数名は大事ですよ。

rb

1@users = User.all

array変数はループの外で初期化しましょう。

rb

1array = [] 2@users.each do |user| 3 array << { 4 name: user.name, age: user.age 5 } 6end

ちなみに

rb

1array = @users.map do |user| 2 user.slice :name, :age 3end

でも同じことができます。

投稿2020/02/09 13:08

Mugheart

総合スコア2342

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lilywhite

2020/02/09 23:09

ありがとうございます!そうですよね、初期化も繰り返してたら当然ああいう結果になりますよね。初歩的な質問だったにも関わらず丁寧に回答してくださってありがとうございました!変数名も気を付けます!
guest

0

ループ中でarray = []しているので、
・空にする
・1件追加する
を繰り返しています。

投稿2020/02/09 13:08

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lilywhite

2020/02/09 23:10

単純すぎるミスでした!ご指摘ありがとうございました!
guest

0

each をつかった方法だけでなく、それ以外の方法も示してみます。

ruby

1attrs = [] 2User.order(:name).each {|u| attrs << {name: u.name, age: u.age}} 3 4User.order(:name).pluck(:name, :age).map{|x| {user: x[0], age: x[1]}} 5 6User.order(:name).map{|x| {user: x.name, age: x.age}} 7 8User.order(:name).select(:user, :age).map(&:attributes)

実行例
次のような User の内容の状態を seed.rb で作っています。
イメージ説明

各方法をためしてみています。
イメージ説明

イメージ説明

投稿2020/02/11 00:22

編集2020/02/12 22:02
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これでいかがでしょう!!

ruby

1# 変更前 2@user = User.all 3 4@user.each do |user| 5 array = [] 6 array << { 7 name: user.name, age: user.age 8 } 9end 10 11# 変更後 12@user = User.all 13array = [] 14 15@user.each do |user| 16 array << { 17 name: user.name, age: user.age 18 } 19end 20

eachループの中でarray = []を宣言してしまっていたので、イテレーション毎にarray変数が初期化されてしまっていたので、ループの外に出しました

補足

array という名前は他と被ったりすることもありますし、、というかそもそも、rubyに存在するメソッド名を上書きしてしまっている気がするので、他の名前に変えた方がよさそうです。。。

投稿2020/02/09 13:09

siruku6

総合スコア1382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siruku6

2020/02/09 13:10

(みんな同じこと書いてるやん...)(´・ω・`)
lilywhite

2020/02/09 23:12

初歩的な質問にも関わらず丁寧に回答いただきありがとうございます!解決いたしました! 実際書いていたコードが変数だらけだったので例として分かりやすい?ものに置き換えてみたんですが、逆にわかりづらくなってしまっていたかもしれません、すいません!命名に気を付けるようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問