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

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

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

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

Q&A

解決済

2回答

1907閲覧

each文。より簡潔な書き方を教えてください

Yuumiiv

総合スコア7

Ruby

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

0グッド

0クリップ

投稿2016/05/16 08:31

編集2016/05/16 08:35

###前提・実現したいこと
Railsでseedデータを作成しています。
regionと、regionとbelongs_toの関係にある、countryというテーブルに対して操作を行っています。
もっと短くかけるようなコードはどのようにかけますでしょうか。

###該当のソースコード

ruby

1regions = ["asia", "north america", "oceania"] 2asia = ["Japan","China","Korea"] 3north_america = ["Bermuda","Canada","Greenland","Saint Pierre and Miquelon","United States"] 4oceania = ["Australia","Fiji","French Polynesia","Guam","Kiribati","Marshall Islands"]

世界の地域名の配列とその地域に所属する国の配列がある。
これを・・・。

ruby

1regions.each do |elem| 2 Region.create(name: elem) 3end

と実行した後に、

ruby

1asia.each do |elem| 2 Country.create(name: elem, region_id:1) 3end

ruby

1north_america.each do |elem| 2 Country.create(name: elem, region_id:2) 3end

以下省略。
地域毎にeach文を回しています。
これでも目的は果たせるのがですが、何度も同じ内容でeachしているので、かっこ悪いですし、
もっと短くかけたらと思います。

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

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

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

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

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

guest

回答2

0

belongs_to 関係を hash + array で表現して、それをループさせると良さそうです。
実際には走らせていないので、このままではエラーになるかもしれません。
エッセンスが伝わればとおもいます。

ruby

1regions = { 2 asia: ['Japan', 'China', 'Korea'], 3 north_ameria: ['Bermuda', 'Canada', 'Greenland', 'Saint Pierre and Miquelon', 'United States'], 4 oceania: ['Australia', 'Fiji', 'French Polynesia', 'Guam', 'Kiribati', 'Marshall Islands'] 5} 6 7regions.each do |key, val| 8 region = Region.create(name: key) 9 region.countries = val.map { |c_name| Country.new(name: c_name) } 10end
  1. region に含まれる国を配列で指定する。

2. 各 region を作る。
国名の配列から、Countory の配列を map をつかって作り,
それを resion.countries に代入する。
これで 各 country の region_id は resion.id が設定されるはず。

参考情報:

投稿2016/05/16 13:06

katoy

総合スコア22324

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

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

0

ベストアンサー

こんな感じでしょうか。

Ruby

1regions = [["asia",1], ["north america",2], ["oceania",3]] 2asia = ["Japan","China","Korea"] 3north_america = ["Bermuda","Canada","Greenland","Saint Pierre and Miquelon","United States"] 4oceania = ["Australia","Fiji","French Polynesia","Guam","Kiribati","Marshall Islands"] 5 6regions.each do |region,region_id| 7 Region.create(name: region) 8 binding.local_variable_get(region.gsub(/ /,"_")).each do |elem| 9 Country.create(name: elem, region_id: region_id) 10 end 11end

regionsは、ハッシュにする方が良いかもしれません。

投稿2016/05/16 08:45

otn

総合スコア84498

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問