如何遍历表并为每个值创建哈希?

时间:2017-11-19 15:28:18

标签: ruby-on-rails ruby hash

我有两张桌子。一个用于帐户,另一个用于关键字我想迭代所有关键字并将每个关键字存储在哈希中 - 按添加关键字的帐户ID分组。我在下面的代码不会将每个关键字添加到哈希。例如,我有一个有2个关键字条目的帐户。我的代码跳过第一个条目,只将第二个条目添加到哈希值。

@keyword_hash = {}

@account.each do |key, value|

  @keywords.where(:profile_id => key).each do |keyword|

    @keyword_hash[key] = keyword.entry

  end
end
puts @keyword_hash

如何修改上述代码,以便将特定帐户的每个关键字条目添加到哈希?

我希望能够执行@keyword_hash [6]并获取该帐户的keyword1,keyword2,keyword3等。谢谢!

3 个答案:

答案 0 :(得分:0)

试试此代码

@keyword_hash = Hash.new { |h, k| h[k] = [] } 
@account.each do |key, value|
  @keywords.where(:profile_id => key).each do |keyword|
    @keyword_hash[key] << keyword.entry
  end
end
puts @keyword_hash

您所犯的错误是您在key哈希中为每个@keyword_hash存储一个值。因此,当您的代码针对帐户密钥写入第二个值时,它会替换先前的值而不是添加第二个值。

编辑:感谢@mudasobwa关于共享默认值的更正。

答案 1 :(得分:0)

@keyword_hash = Hash.new { |hash, key| hash[key] = [] }

  @keywords.group_by{ |k| k.profile_id }.each do |key,value|
    @keyword_hash[key] = value.map(&:entry)
    end

  puts @keyword_hash

在做了一些研究后,我找到了上述解决方案。我使用了@jvillian关于group_by的建议,我发现这个article向我展示了如何初始化哈希。

答案 2 :(得分:0)

创建一个数组[keyword1,keyword2,keyword3等],然后将其添加到哈希

**

@keyword_hash = {}
@account.each do |key, value|
    arr = []
    @keywords.where(:profile_id => key).each do |keyword|
      arr << keyword.entry
    end
    @keyword_hash[key] = arr
end
puts @keyword_hash

**