Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Ruby中迭代数组以构造哈希_Ruby On Rails_Ruby_Arrays - Fatal编程技术网

Ruby on rails 在Ruby中迭代数组以构造哈希

Ruby on rails 在Ruby中迭代数组以构造哈希,ruby-on-rails,ruby,arrays,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"} 我想知道是否有更好的方法遍历数组并得到散

目前我有:

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"}
我想知道是否有更好的方法遍历数组并得到散列值。

编写如下:

cache_hash = Hash[array.map { |k| [k, data_source.send(k)] }]
或者使用新的

写如下:

cache_hash = Hash[array.map { |k| [k, data_source.send(k)] }]
或者使用新的


我不确定您是否希望遵循此路线,但这里有一个AR查询的替代方案:

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

Foo是您正在操作的模型。

我不确定您是否希望遵循此路线,但这里有一个AR查询的替代方案:

Foo.select('id, content, title').to_a.map(&:serializable_hash)
Foo是您正在操作的模型。

这类似于使用map。在任何编程语言(不仅仅是Ruby)中,映射函数最酷的地方在于,您还可以用 在其他语言中,注入函数也称为fold、reduce或aggregate:

cache_hash = array.inject({}) do |hash, key|
  hash[key] = data_source.send key
  hash
end
虽然没有奥雅纳使用地图的答案那么清晰,但无论如何知道这一点都很酷。

这与使用地图类似。在任何编程语言(不仅仅是Ruby)中,映射函数最酷的地方在于,您还可以用 在其他语言中,注入函数也称为fold、reduce或aggregate:

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

虽然没有奥雅纳使用地图给出的答案那么清晰,但无论如何知道这一点都很酷。

这很有趣。因为我只针对一个对象,而不是一个数组,所以我得到的结果是:data_source.serializable_hashonly:[:id,:content]。这非常有趣。因为我只针对一个对象,而不是一个数组,所以我得到的结果是:data_source.serializable_hashonly:[:id,:content]。感谢您的所有输入。我知道选择rails特定的答案是不公平的。但是我也很欣赏@Arup给我的教训。不,这是完全公平的,因为你用ruby on rails标记了它,因此rails的答案是合适的。谢谢你的所有意见。我知道选择rails特定的答案是不公平的。但是我也很欣赏@Arup的教训。不,这是完全公平的,因为你用ruby-on-rails标记了它,因此rails的答案是合适的。