2012-08-13 17 views
5

que tienen el método:aceptar ya sea un hash o una matriz de valores hash como argumentos a un método de Ruby

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

Funciona perfectamente, si pasa una matriz de valores hash:

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

Sin embargo , puede ser que quiera pasar un solo Hash, en lugar de una matriz de valores hash:

params = { key: 'value' } 

Lo que b ¿La forma más limpia de Ruby de convertir un hash en una matriz de Hashes?

El método Array() asegura que siempre se devuelve una matriz, pero cuando se pasa la Hash, se convierte en una matriz.

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

lo que necesito:

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

¿Hay alguna buena manera de implementar esto, o tengo que hacer una comprobación de tipo manual con is_a (Array)??

Respuesta

6

Para mí, la mejor solución es cambiar el método a:

def self.store(*hashes) 
    params = hashes.flatten 
    puts params.inspect 
end 
  • Si pasa un hash único, que será una matriz
  • Si pasa una matriz de valores hash, sigue siendo el mismo
  • Si pasa N valores hash, compacta todos los parámetros en uno matriz dimensional

Puede pasar lo que quiera.

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

Prueba este

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

lo haría así:

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