如何创建1维和2维哈希

时间:2016-07-31 14:05:14

标签: ruby-on-rails ruby hash

我正在从数据库加载数据并将其保存为常量,如下所示:

profession = Hash.new
Profession.all.each do |p|
  profession[p.name] = p.unique_profession
  profession[p.name]['descr'] = p.description # problem
  profession[p.name]['created_at'] = p.created_at # problem
end

profession[p.name]['descr']行出现此错误:

undefined method `[]=' for 1:Fixnum (NoMethodError)

我想使用profession之类的:

<div>Profession name: <%= profession[p.name] %></div>
<div>Description: <%= profession[p.name]['descr'] %></div>

如何将profession作为一个[name]和两个[name][descr]参数使用?

2 个答案:

答案 0 :(得分:1)

您从空哈希开始:

{}

然后,对于每个职业记录,您分配profession[p.name] = p.unique_profession。假设unique_professionFixnum,这意味着你得到了这个:

{
  'ProfessionName1' => 1,
  'ProfessionName2' => 2
}

等等。

您无法将子键分配给Fixnum - 它不是哈希值。您可能希望使用以下数据结构之一(我将按照代码的结构来创建它):

{
  'ProfessionName1' => {
    'descr' => 'Description of Profession 1',
    'created_at' => '2016-05-08T22:33:38.093753Z'
  },
  'ProfessionName2' => {
    'descr' => 'Description of Profession 2',
    'created_at' => '2015-04-09T21:23:33.093753Z'
  }
}
profession = Hash.new
Profession.all.each do |p|
  profession[p.name] = Hash.new
  profession[p.name]['descr'] = p.description
  profession[p.name]['created_at'] = p.created_at
end

或只是包含每个属性的哈希数组:

[
  {
    'name' => 'ProfessionName1',
    'descr' => 'Description of Profession 1',
    'created_at' => '2016-05-08T22:33:38.093753Z'
  },
  {
    'name' => 'ProfessionName2',
    'descr' => 'Description of Profession 2',
    'created_at' => '2015-04-09T21:23:33.093753Z'
  }
]
profession = []
Profession.all.each do |p|
  profession << {
    'name' => p.name,
    'descr' => p.description,
    'created_at' => p.created_at
  }
end

答案 1 :(得分:0)

如果你想使用哈希,你需要存储“unique_profession”&#39;进入一把新钥匙。

<div>Profession name: <%= profession[p.name]['unique'] %></div>
<div>Description: <%= profession[p.name]['descr'] %></div>

然后你可以这样做(但请注意输出将是一个数字,unique_profession的内容):

profession = Hash.new
Profession.all.each do |p|
  profession[p.name] = []
  profession[p.name][:unique] = p.unique_profession
  profession[p.name][:descr] = p.description
  profession[p.name][:created_at] = p.created_at
end

最后,我建议使用符号而不是字符串(因为这是Ruby方式):

<div>Profession name: <%= profession[p.name][:unique] %></div>
<div>Description: <%= profession[p.name][:descr] %></div>

然后

{{1}}

另一方面,您可以直接存储和使用Profession实例。