【问题标题】:iterate through array of hashes in ruby遍历 ruby​​ 中的哈希数组
【发布时间】:2014-12-30 16:56:18
【问题描述】:

所以如果我有一个这样的哈希数组:(ruby 初学者)

input =  [

{"last_name"=>"Gay", "first_name"=>"Rudy", "display_name"=>"Rudy Gay", "position"=>"SF", "minutes"=>39, "points"=>25, "assists"=>6}, 
{"last_name"=>"Collison", "first_name"=>"Darren", "display_name"=>"Darren Collison", "position"=>"PG", "minutes"=>39, "points"=>14, "assists"=>4}

]

我将如何遍历数组以及遍历每个哈希以获得类似这样的内容:

player1 = {display_name=>"rudy gay", "position"=>"SF"}

player2 = {display_name=>"darren collison", "position"=>"PG"}

会不会是这样的

input.each do  |x|
Player.create(name: x['display_name'], position: x['position']
end

(假设我有一个播放器模型)

有没有更好的方法来实现这一点?

谢谢!

【问题讨论】:

  • 该代码是正确的,除了缺少尾随 )。问题是什么?您收到任何错误吗?
  • 嗨,Simone,我想知道是否有更红宝石的方法可以做到这一点,或者是否有更有效的方法。
  • 查看这个答案:stackoverflow.com/a/10022240/4178151。您可以将该哈希数组直接传递给 create 方法以进行一次大插入。
  • +1 欢迎来到 SO 和 Ruby!

标签: ruby-on-rails ruby arrays hash


【解决方案1】:

鉴于您的意见:

input =  [
  { "last_name"=>"Gay", ... }, 
  { "last_name"=>"Collison", ...}
]

如果所有这些键(last_name、first_name、display_name)都存在于 Player 模型中,您可以:

input.each do |x|
  Player.create(x)
end

因为create 将采用属性散列来分配。但是,更好的是,您甚至不需要迭代:

Player.create(input)

如果你给它一个哈希数组,ActiveRecord 将遍历它们。

【讨论】:

  • 谢谢!如果我想拆分我的 Player 模型和我的连接表(Stat 模型)之间的哈希,所以 Player.name = "darren collison" 但将积分、助攻和类似的东西保存为 Stat.assist 怎么办? (希望这是有道理的)我有 Game、Player 和 Stat 模型,其中 stat 是游戏和玩家之间的连接表。
  • 很难在 cmets 中解决这个问题,这完全是一个新问题。试一试,阅读the AR associations guide,您可能会非常接近。任何其他细节只需再次发布,肯定有人会帮助您完成剩下的工作。
猜你喜欢
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 2018-09-25
  • 2016-09-03
  • 2012-08-22
相关资源
最近更新 更多