首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rails遍历关键值元素的列表

rails遍历关键值元素的列表
EN

Stack Overflow用户
提问于 2013-03-14 02:10:12
回答 1查看 615关注 0票数 0

我有这样一个键值对的列表。

代码语言:javascript
复制
  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,但是我无法获得正确的语法。

以下是我到目前为止尝试过的:

代码语言:javascript
复制
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

编辑:最终我需要通过这个函数将它插入到数据库表中:

代码语言:javascript
复制
PersonOffense.where(person_id: person.id).first_or_create(
          name: offense_name,
          penalty: penalty_name ,
          severity: severity_val
      end

但我注意到一个问题,上面有多个惩罚名字。不知道怎么插入它们。

例如,我需要在表中插入两次offense_name,以便表中有两个条目。

代码语言:javascript
复制
Speeding Prison Medium

Speeding Ticket Low

编辑:我喜欢杰西下面的回答。如何使用它以与上面的方法相同的顺序插入它(插入offense_name、penalty_name和严重性,并给出如下答案的结果)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-14 02:25:19

与其仅仅使用每一种方法,如果你对犯罪行为进行了映射,然后最终将其夷为平地,那么你就会得到你想要的:

代码语言:javascript
复制
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:

代码语言:javascript
复制
offenses.each do |hash|
  PersonOffense.where(person_id: person.id).first_or_create( hash )
end
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15399949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档