2016-07-31 8 views
0

ich Daten aus der Datenbank bin Laden und es auf eine Konstante wie folgt zu speichern:Wie 1- und 2-dimensionale Hash erstellen

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 

Auf der Linie profession[p.name]['descr'] tritt dieser Fehler auf:

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

ich möchte profession wie verwenden:

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

Wie kann ich profession Arbeit machen mit als ein [name] und als zwei Parameter?

+0

Um mehrere Schlüssel zu übergeben, möchten Sie wahrscheinlich einen verschachtelten Hash haben. Wenn Sie möchten, dass der Wert-Hash eine Zeichenkette für 'to_s' zurückgibt, müssen Sie' Hash # to_s' auf eine seltsame, katastrophale Weise neu definieren. Andernfalls können Sie nicht. – sawa

+0

Welcher Typ ist 'p.unique_profession'? – ArtOfCode

+0

@ArtOfCode 'Fixnum'. – sawa

Antwort

1

Sie beginnen mit einem leeren Hash:

{} 

Dann wird für jeden Beruf aufnehmen, Sie profession[p.name] = p.unique_profession zuordnen. Unter der Annahme, dass unique_profession ein Fixnum ist, bedeutet, dass Sie diese bekommen:

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

und so weiter.

Sie können Fixnum keine Unterschlüssel zuweisen - es ist kein Hash. Vielleicht möchten Sie stattdessen eine der folgenden Datenstrukturen (Ich werde die Struktur mit dem Code folgen, es zu schaffen):

{ 
    '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 

oder einfach ein Array von Hashes jede Eigenschaft enthält:

[ 
    { 
    '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 
0

Wenn Sie Hashes verwenden Sie ‚unique_profession‘ in einen neuen Schlüssel speichern müssen.

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

Dann können Sie dies tun (aber beachten Sie wird die Ausgabe eine Zahl sein, die Inhalte von unique_profession):

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

Schließlich würde ich mit Symbolen anstelle von Strings empfehlen (wie das ist Ruby-Weg):

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 

Dann

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

Auf der anderen Seite können Sie die Profession-Instanzen direkt speichern und verwenden.

+0

Danke @Owen. Aber gibt es eine Möglichkeit, Inhalte wie in' profession [p.name] '=> Drucken des Berufsnamens und auch' profession [p.name ] [: descr] '=> Druck der Beschreibung des Berufs? Was ist im Grunde, was ich versuche zu erreichen. Arbeiten an einem großen Projekt und überall wird verwendet, Beruf [p.name]', so dass es schwer sein würde, dies zu überschreiben .. die gesamte Anwendung Dank – user984621

+0

Warum ändert nicht nur die Profession # to_s Methode die Namen drucken 'Klasse Beruf ... def to_s;? Namen; Ende; ... end' – Owen