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