2010-01-21 125 views
0

嘿,在此先感谢您的帮助。微重构:从对象创建JSON的哈希

我有另一个非常简单的问题。 这不像轨道,但它的工作原理。有没有办法做得更好?我知道有日期的group_by,但我无法弄清楚如何使用它。 我仍然是红宝石超级新手,但足够知道,必须有更好的方法!

def self.getRecipeNames 
    recipes = Recipe.all 
    names = Hash.new 
    recipes.each do |recipe| 
     names[recipe.id] = recipe.name 
    end 
    names 
end 

谢谢!

回答

1

您可以使用reduceinject在旧版本的Ruby)到你的食谱清单转变为单一的哈希(这就是为什么它被降低,它降低了单个值,可以是列表/散列/其它):

recipes = Recipe.all 
names = recipes.reduce({}) do |acc,el| 
    acc[el.id] = el.name 
    acc 
end 
0

这是更漂亮的(IMO),但可能不像您原来的方法(或MBO)那么高效。

def self.getRecipeNames 
    Hash[Recipe.all.map{|r| [r.id, r.name] }] 
end 

此使用该Hash::[]取键/值对,例如阵列的事实Hash[[:a, 1], [:b, 2]] => { :a => 1, :b => 2 }

编辑:其实我敢肯定,这是成功的一半高效既是原始的方法和MBO的,因为这两个Array#mapHash::[]迭代通过整个阵列。所以它很漂亮,但是如果你有这样的话就不要使用它。数千条记录。

0

如果这是在配方模型,使用:select

def self.getRecipeNames 
    find(:all, :select => 'id, name') 
end 

控制器:

@names = Recipe.getRecipeNames 
@names.to_json # etc.