2012-08-13 12 views
5

Annehmen habe ich die Methode:entweder ein Hash oder ein Array von Hashes als Argument an einen Rubin Methode

def self.store(params) 
    params.each { } 
end 

Es perfekt funktioniert, wenn ich ein Array von Hashes passieren:

params = [ { key: 'value' }, { key: 'value' } ] 

Jedoch

params = { key: 'value' } 

Was würde b:, könnte ich nur einen einzigen Hash anstelle eines Array von Hashes übergeben möchten Der sauberste Ruby-Weg, um einen Hash in ein Array von Hashes zu konvertieren?

Die Array() -Methode stellt sicher, dass ein Array immer zurückgegeben wird, aber wenn der Hash übergeben wird, wird er selbst in ein Array konvertiert.

Array({ key: 'value' }) => [[:key, 'value']] 

Was ich brauche:

{ key: 'value' } => [ { key: 'value' } ] 

Gibt es eine schöne Möglichkeit, dies zu implementieren, oder muss ich eine manuelle Art mit is_a Überprüfung tun (Array)?

Antwort

6

Für mich ist die beste Lösung ist, um das Verfahren zu ändern:

def self.store(*hashes) 
    params = hashes.flatten 
    puts params.inspect 
end 
  • Wenn Sie einen einzelnen Hash übergeben, wird es sein, ein Array
  • Wenn Sie ein Array von Hashes übergeben, bleibt es gleich
  • Wenn Sie N Hashes pases, verdichtet es alle Parameter in eine Eins dimensionales Array.

Sie können passieren, was Sie wollen.

self.store({:key => 'value'}) # => [{:key => 'value'}] 
self.store({:key => 'value'}, {:foo => 'bar'}) # => [{:key => 'value'}, {:foo => 'bar'}] 
self.store([{:key => 'value'}, {:foo => 'bar'}]) # => [{:key => 'value'}, {:foo => 'bar'}] 
3

Versuchen Sie, diese

def self.store(params) 
    params = [params].flatten 
    ... 
end 
0

Ich würde es tun, wie folgt:

def self.store(params) 
    (params.is_a?(Array) ? params : [params]).each {|single_hash| } 
end 
Verwandte Themen