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

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

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

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

Q&A

解決済

4回答

886閲覧

ループ処理しながら要素を保存していく

yiyi

総合スコア32

Ruby on Rails

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

0グッド

0クリップ

投稿2019/04/19 13:48

前提・実現したいこと

RoR初心者で初歩的な質問かもしれませんが、
教えて頂けると幸いです。

eachやmapのループで処理しながら、
かつ要素を保存していくことは可能でしょうか。

ざっとですがやりたいことはこんな感じです。

  params[:hogehoge].map do |hoge|
ループ内処理
end

↑のループ内で処理したhogeをどんどん保存していきたい(貯めていきたい?)

結果的には、
下記のようにHashを保存していきたいです。

{"hoge1" : "XXXX", "hoge2" : "XXXX", "hoge3" : "XXXX", "hoge4" : "XXXX"}

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

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

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

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

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

mather

2019/04/19 14:54

params[:hogehoge] は具体的にどんな値なのでしょうか?具体例を一つ示してください。
guest

回答4

0

ベストアンサー

次の例を研究してみてください。
zzz.rb

ruby

1params = {hogehoge: {a: 1, b: 2, c:3}} 2 3x = params[:hogehoge].map{|k, v| [k, "xxx_#{v}"]}.to_h 4p x 5 6x = params[:hogehoge].each_with_object({}){|(k, v), mem| mem[k] = "xxx_#{v}"} 7p x 8 9x = params[:hogehoge].inject({}) do |mem, (k, v)| 10 mem[k] = "xxx_#{v}" 11 mem 12end 13p x 14 15result = {} 16params[:hogehoge].each {|k, v| result[k] = "xxx_#{v}"} 17p result

実行例
イメージ説明

  • injectとeach_with_objectって何が違うのさ?

https://qiita.com/Kta-M/items/c9781e09d96601687767

投稿2019/04/19 23:02

編集2019/04/19 23:35
katoy

総合スコア22324

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

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

yiyi

2019/04/20 18:45

ありがとうございます...! 上記のコードで解決できそうです。 ご丁寧にありがとうございます。
guest

0

inject の例です。詳しいメソッドの使い方や解説については公式リファレンスを探して参照してください。

ruby

1[1,2,3,4].inject({}) { |h, e| 2 h["hoge#{e}"] = e + 1 3 h 4} 5#=> {"hoge1"=>2, "hoge2"=>3, "hoge3"=>4, "hoge4"=>5}

投稿2019/04/19 15:04

mather

総合スコア6753

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

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

yiyi

2019/04/20 19:17

ご回答ありがとうございます。 injectを使用して解決できそうです。
guest

0

params[:hogehoge]の中身がHashかArrayかにもよりますが、
Hashだとすると、

params[:hogehoge] = { hoge: 1, fuga: 2 } params[:hogehoge].map do |key, val| [key, val + 1] end.to_h => {:hoge => 2, :fuga => 3}

上記のブロック内部配列のkeyの部分を変更すればkeyを編集でき、val + 1の部分を変更すればvalを編集できると思います。
params[:hogehoge]が配列なのであれば、ブロック変数が一つになるくらいの差異かなと思います。

投稿2019/04/19 15:01

cmmmli

総合スコア13

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

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

yiyi

2019/04/20 18:47

ご回答ありがとうございます。 情報が不足していて申し訳ありませんでした。 中身はHashでした。
guest

0

可能です。Hash形式の変数を用意してループのなかで更新するとよいです。
そのような場合、一般的には each や map ではなく inject メソッドを使うことが多いです。

投稿2019/04/19 14:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yiyi

2019/04/19 14:30

ご回答ありがとうございます。 更新というとmergeとかでしょうか...? コードを書いて頂けると助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問