如何编写Ruby one-liner将小型AR表读入哈希?

时间:2013-05-17 21:30:52

标签: ruby-on-rails ruby

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

但我发现我不知道如何在一行中做到这一点。我可以用两个来做:

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

我知道如何从块返回2D数组。但有没有办法从这样的块创建和返回哈希?

3 个答案:

答案 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 }