1

我有一个名为的模型Category,其中包含大约一千条记录。它变化极少。我想通过缓存它来避免数百万次数据库命中,这没什么大不了的。

但是我发现我不知道如何在一行中做到这一点。我可以分两步完成:

category_hash = {}
Category.each { |c| category_hash[c.id] => category }

我知道如何从块中返回一个二维数组。但是有没有办法从这样的块中创建和返回散列?

4

3 回答 3

4

在 Rails 中有Enumerable#index_by

category_hash = Category.all.index_by(&:id)

如果没有 Rails,我会使用:

Hash[Category.all.map{ |c| [c.id, c] }]

Hash::[]从平面数组和嵌套数组中创建一个哈希:

Hash["a", 100, "b", 200]             #=> {"a"=>100, "b"=>200}
Hash[ [ ["a", 100], ["b", 200] ] ]   #=> {"a"=>100, "b"=>200}
于 2013-05-18T05:58:46.327 回答
3
Category.all.reduce(Hash.new) { |h, c| h[c.id] = c; h }
于 2013-05-17T21:33:56.017 回答
2

你可以这样做:

Category.each_with_object({}) { |c,category_hash| category_hash[c.id] = category }
于 2013-05-17T21:33:56.117 回答