2010-01-21 2 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

당신은 하나의 해시 조리법의 목록을 변환 (루비의 이전 버전에서 inject) reduce을 사용할 수 있습니다 (즉,이 감소되는 이유, 그것은 될 수 단일 값, 목록/해시/무엇 이건 감소) :

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.