0

このようなキーと値のペアのリストがあります。

  PERSON_SUMMARY = {
      first_names: %w(Mike Tim Jim kevin Alan Sara John Sammy t'Renée),
      last_names: %w(Robinson Jackson Fox Terry Ali Brits Tyson Willis-St.\ Paul),
      offenses: [
        { offense_name:'Speeding', 
          penalties: [
            { penalty_name: 'Prison', severity: 'Medium' },
            { penalty_name: 'Ticket', severity: 'Low' }
          ]
        },
         { offense_name:'Shoplifting', 
          penalties: [
            { penalty_name: 'Prison', severity: 'Medium' },
            { penalty_name: 'Fine', severity: 'Low' }
          ]
        }
      ]
  }

offense_name、** penalty_name **、severityを1つずつ保存して出力したいのですが、正しい構文を取得できません。

これが私がこれまでに試したことです:

PERSON_SUMMARY[:offenses].each do |offense|
      offense_name = offense[:offense_name]
      offense[:penalties].each do |penalty|
        penalty_name = penalty[:penalty_name]
        severity_val = penalty[:severity]
      end
end

編集:最終的に私はこの関数を介してデータベーステーブルにそれを挿入する必要があります:

PersonOffense.where(person_id: person.id).first_or_create(
          name: offense_name,
          penalty: penalty_name ,
          severity: severity_val
      end

しかし、私は問題に気づきました。上記には複数のペナルティ名があります。それらを挿入する方法がわからない。

たとえば、テーブルに2つのエントリがあるように、テーブルにoffense_nameを2回挿入する必要があります。

Speeding Prison Medium

Speeding Ticket Low

編集:私は以下のジェシーの答えが好きです。上記の方法と同じ順序で挿入するにはどうすればよいですか(offense_name、penalty_name、severityを挿入し、Jesseが以下に回答した結果を示します)。

4

1 に答える 1

3

それぞれを使用するだけでなく、オフェンスをマッピングして、最終的にフラット化すると、必要なものが得られます。

offenses = PERSON_SUMMARY[:offenses].map do |offense|
  offense[:penalties].map do |penalty|
    penalty.merge(name: offense[:offense_name])
  end
end.flatten

=> [{:penalty_name=>"Prison", :severity=>"Medium", :name=>"Speeding"}, {:penalty_name=>"Ticket", :severity=>"Low", :name=>"Speeding"}, {:penalty_name=>"Prison", :severity=>"Medium", :name=>"Shoplifting"}, {:penalty_name=>"Fine", :severity=>"Low", :name=>"Shoplifting"}]

アップデート

ルビーでは、以下はハッシュであり、あなたはすでにハッシュを持っていますここに画像の説明を入力してください

したがって、新しい配列をループして、PersonOffenseを作成できます。

offenses.each do |hash|
  PersonOffense.where(person_id: person.id).first_or_create( hash )
end
于 2013-03-14T02:25:19.487 に答える