0

我有一個像這樣的鍵值對列表。ruby​​ on rails通過關鍵值元素列表循環訪問

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和嚴重性一個接一個,但我不能得到正確的語法。

這裏是我到目前爲止已經試過:

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 

但是我發現一個問題,有上面是多個罰款名稱。不知道如何插入它們。

例如, 我需要在我的表中插入兩次犯規,以便表中有兩個條目。

Speeding Prison Medium 

Speeding Ticket Low 

編輯:我喜歡傑西的答案如下。我怎樣才能使用它來按照我上面的方法將它插入(按照下面的Jesse給出的答案插入犯罪號,罰名和嚴重性)

+0

什麼不適合您的解決方案?你想達到什麼目的? – doesterr 2013-03-14 02:20:49

+0

就像我上面提到的,我試圖存儲和打印「罪名」,「刑罰名稱」和嚴重程度。我得到這個錯誤的語法錯誤,意想不到的關鍵字,期待')'在上面的最後一行 – newbie 2013-03-14 02:32:56

+0

嗯,你的解決方案對我來說很好(Renée中的é字符除外) – doesterr 2013-03-14 02:35:53

回答

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

UPDATE

在Ruby中,下面是一個哈希,你已經有了一個哈希enter image description here

所以你可以循環thro呃你的新陣列,並創建您的PersonOffense:

offenses.each do |hash| 
    PersonOffense.where(person_id: person.id).first_or_create(hash) 
end 
+0

你能看到我的編輯。我需要律幫助,因爲我對ruby很新穎 – newbie 2013-03-14 02:57:51

+0

@newbie更新 – 2013-03-14 13:27:44