Ruby on rails 接受哈希或哈希数组作为Ruby方法的参数

Ruby on rails 接受哈希或哈希数组作为Ruby方法的参数,ruby-on-rails,ruby,Ruby On Rails,Ruby,我的方法是: def self.store(params) params.each { } end 如果我传递一个散列数组,它将非常有效: params = [ { key: 'value' }, { key: 'value' } ] params = { key: 'value' } 但是,我可能只想传递一个散列,而不是一个散列数组: params = [ { key: 'value' }, { key: 'value' } ] params = { key: 'value' }

我的方法是:

def self.store(params)
  params.each { }
end
如果我传递一个散列数组,它将非常有效:

params = [ { key: 'value' }, { key: 'value' } ]
params = { key: 'value' }
但是,我可能只想传递一个散列,而不是一个散列数组:

params = [ { key: 'value' }, { key: 'value' } ]
params = { key: 'value' }
将散列转换为散列数组的最干净的Ruby方法是什么?

Array()方法是一种确保始终返回数组的方法,但当散列被传递时,它将转换为数组本身

Array({ key: 'value' }) => [[:key, 'value']]
我需要的是:

 { key: 'value' } => [ { key: 'value' } ]
有什么好方法可以实现这一点,或者我必须用Is_a?(数组)进行手动类型检查吗?

试试这个

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

对我来说,最好的解决方案是将方法更改为:

def self.store(*hashes)
  params = hashes.flatten
  puts params.inspect
end
  • 如果传递一个散列,它将是一个数组
  • 如果传递一个哈希数组,它将保持不变
  • 如果对N个散列进行pase,它会将所有参数压缩为一维数组
你想通过什么就通过什么

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'}]

我会这样做:

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