我有一个名为的模型Category
,其中包含大约一千条记录。它变化极少。我想通过缓存它来避免数百万次数据库命中,这没什么大不了的。
但是我发现我不知道如何在一行中做到这一点。我可以分两步完成:
category_hash = {}
Category.each { |c| category_hash[c.id] => category }
我知道如何从块中返回一个二维数组。但是有没有办法从这样的块中创建和返回散列?
我有一个名为的模型Category
,其中包含大约一千条记录。它变化极少。我想通过缓存它来避免数百万次数据库命中,这没什么大不了的。
但是我发现我不知道如何在一行中做到这一点。我可以分两步完成:
category_hash = {}
Category.each { |c| category_hash[c.id] => category }
我知道如何从块中返回一个二维数组。但是有没有办法从这样的块中创建和返回散列?
在 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}
Category.all.reduce(Hash.new) { |h, c| h[c.id] = c; h }
你可以这样做:
Category.each_with_object({}) { |c,category_hash| category_hash[c.id] = category }