我有这样一个键值对的列表。
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,但是我无法获得正确的语法。
以下是我到目前为止尝试过的:
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但我注意到一个问题,上面有多个惩罚名字。不知道怎么插入它们。
例如,我需要在表中插入两次offense_name,以便表中有两个条目。
Speeding Prison Medium
Speeding Ticket Low编辑:我喜欢杰西下面的回答。如何使用它以与上面的方法相同的顺序插入它(插入offense_name、penalty_name和严重性,并给出如下答案的结果)。
发布于 2013-03-14 02:25:19
与其仅仅使用每一种方法,如果你对犯罪行为进行了映射,然后最终将其夷为平地,那么你就会得到你想要的:
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 )
endhttps://stackoverflow.com/questions/15399949
复制相似问题