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' }
          ]
        }
      ]
  }

我只想存储和打印offence_name,**penalty_name** 和severity,但我无法获得正确的语法。

这是我到目前为止所尝试的:

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 个条目。

Speeding Prison Medium

Speeding Ticket Low

编辑:我喜欢下面杰西的回答。我如何使用它以与我上面的方法相同的顺序将其插入(插入进攻名称、惩罚名称和严重性以及 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"}]

更新

在 ruby​​ 中,下面是一个哈希,而你已经有了一个哈希在此处输入图像描述

所以你可以遍历你的新数组并创建你的 PersonOffense:

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