循环遍历Ruby哈希并访问值

时间:2018-07-16 16:51:04

标签: ruby-on-rails ruby

我对Ruby还是很陌生,找不到适合我问题的答案。假设我的哈希名为     users_hsh = {}。 我正在数据库中遍历所有用户,并创建以下内容。

users.each do |user|
     users_hsh[user.full_name] = {
         completed_activities: some_integer_value,
         active_activities: some_integer_value,
         future_activities: some_integer_value
     } 
end

现在,我创建了一个名为     total_sum_not_zero_user_hsh = {}。 我想遍历users_hsh中的所有用户,并检查每个用户的completed_activities + active_activities + future_activities的总和是否不为0,并且如果此条件成立,我想将此用户添加到total_sum_not_zero_user_hsh中。我已完成以下操作,但似乎无法正常工作。

users_hsh.each do |usr|
    if usr.values.sum != 0
        total_sum_not_zero_user_hsh[usr] = {
            completed_activities: some_integer_value,
            active_activities: some_integer_value,
            future_activities: some_integer_value
        }
    end
end

我在做什么错?预先感谢!

1 个答案:

答案 0 :(得分:0)

让我们使用您的示例:

users_hash = {
  "Elvin Jafarli" => {
    completed_activities: 10,
    active_activities: 2,
    future_activities: 0
  }
}

请仔细考虑您的数据结构实际上是什么:这是将用户名映射到某些用户属性的哈希。如果遍历这些值,则不仅会得到usr,而且还会精确返回此映射。

描述性地命名变量很有帮助:

users_hsh.each do |user_name, user_attributes|
  if user_attributes.values.sum != 0
    # ...
  end
end

通过尝试,您将看到如下错误:NoMethodError: undefined method 'values' for #<Array:0x00007fe14e22f538>。发生的事情是每个usr实际上是一个Array,例如:

["Elvin Jafarli", {completed_activities: 10, active_activities: 2, future_activities: 0}]