迭代数组在Ruby中构造哈希

时间:2014-03-23 20:44:25

标签: ruby-on-rails ruby arrays

目前我有:

cache_hash = {}
array = [:id, :content, :title]
data_source = some_active_record_object
array.each{ |k| cache_hash[k] = data_source.send(k) } 
cache_hash
#=>{:id=>"value1", :content=>"value2", :title=>"value3"}

我想知道是否有更好的方法来遍历数组并获取哈希值。

3 个答案:

答案 0 :(得分:4)

写如下:

cache_hash = Hash[array.map { |k| [k, data_source.send(k)] }]

或使用新的#to_h

cache_hash = array.map { |k| [k, data_source.send(k)] }.to_h

答案 1 :(得分:1)

我不确定您是否要遵循此路线,但此处是AR查询的替代方案:

Foo.select('id, content, title').to_a.map(&:serializable_hash)

Foo是您正在操作的模型。

答案 2 :(得分:1)

这与使用map的{​​{3}}类似。关于map函数的酷炫之处在于,在任何编程语言(不仅仅是Ruby)中,你都可以用它来表达它们。 inject函数(在其他语言中也称为foldreduceaggregate):

cache_hash = array.inject({}) do |hash, key|
  hash[key] = data_source.send key
  hash
end

不像使用map的Arup的回答那么明确,但不管怎么说都很酷。