2013-06-20 2 views
1

: 난 그냥 알고, 이제레일 - 동적 메소드 작성 나는 그들이 참조하는 액티브 클래스에서 떨어져 동일한 두 가지 방법이

def category_id_find(category_name) 
    category = Category.find_by_name(category_name) 
    if category != nil 
    return category.id 
    else 
    return nil 
    end 
end 

def brand_id_find(brand) 
    brand = Brand.find_by_name(brand) 
    if brand != nil 
    return brand.id 
    else 
    return nil 
    end 
end 

몇 가지로이 결합보다 Railsy/루비 방법이 있어야합니다 가지 두 개의 인수, 클래스와 찾을 수있는 문자열을 사용하는 방법을 동적으로 생성, 그래서 나는이 같은 뭔가 시도 (실패) :

def id_find(class, to_find) 
    thing = (class.capitalize).find_by_name(to_find) 
    if thing.id != nil 
    return thing.id 
    else 
    return nil 
    end 
end 

내가 부를 수있는 의미 id_find(category, "Sports")

모든 데이터가 포함 된 하나의 몬스터 CSV 파일에서 시드하는 동안 테이블을 채워야합니다. 예를 들어, CSV에서 모든 고유 한 카테고리를 가져 와서 범주 테이블에서 펀치 한 다음 각 항목의 category_id를 해당 ID가있는 경우 채워진 카테고리 테이블의 ID를 기반으로 할당해야합니다.

thing = passed_in_class.constantize.find_by_name(to_find) 

그러나 당신은 또한 방법에 이유를 실제 클래스 자체를하지에 전달할 수 :

답변

1

class은 예약어 i Ruby (클래스 선언에만 사용됨)이므로 메소드 매개 변수의 이름을 지정할 수 없습니다. 개발자는 종종이 제한과 충돌하지 않고 원래의 의미를 유지하는 klass으로 변경합니다. 그러나이 경우에는 클래스 이름을 문자열로 전달할 것이므로 class_name이라고 부릅니다.

레일즈의 ActiveSupport에는 문자열을 상수로 바꾸는 데 사용할 수있는 내장 된 굴곡 방법이 많이 있습니다. CSV 데이터가 어떻게 표시되는지에 따라 다음과 같이 끝낼 수 있습니다.

def id_find(class_name, to_find) 
    thing = (class_name.camelize.constantize).find_by_name(to_find) 
    ... 
end 
+0

constantize - 내 gogole-fu는 반드시 내가 원하는 것을 고쳐야합니다. - 감사합니다! – BenjiBoyWick

0

문자열을 사용하는 경우, 당신은 투자와 코드가 (이론적으로) 작동합니다 대신 constantize 사용할 수 있습니다 :