2013-03-26 7 views
2

재사용 할 일반적인 메소드를 작성하여 레일스 코드를 정리하고 싶습니다. 그렇게하기 위해서는 코드 변수에 사용되는 필드/속성과 클래스 이름을 만들어야하므로 동일한 코드로 세 모델 (및 해당 필드)에서 작동 할 수 있습니다. 나는이 questionthis one에서 배우려고했지만, 제대로 작동하지 못했습니다. 내 모델에서레일에서 변수 이름을 속성으로 사용하기

, 나는이있다 :이 코드

def self.update_percentages  
    update_percentages_2(User, "rank", "top_percent") 
end 

def self.update_percentages_2(klass, rank_field, percent_field) 
    rank_class = (klass.name).constantize 
    total_ranks = rank_class.maximum(rank_field) 
    top_5 = (total_ranks * 0.05).ceil 

    rank_class.find_each do |f| 
    if f.send("#{rank_field}") <= top_5 
     f.send("#{percent_field}", 5) 
     f.save 
    end 
    end 
end 

을, 나는 ArgumentError: wrong number of arguments (1 for 0)를 얻을. 문제의 범위를 좁히기 위해 라인을 주석 처리하기 시작하면 f.send("#{percent_field}", 5)이 오류를 일으키는 것으로 보입니다.

내가 추가 한 경우 : percent_field = (percent_field).constantize

내가 얻을 : Name Error: wrong constant name top_percent.

누군가 내가 잘못하고있는 것을 결정할 수 있도록 도와 줄 수 있습니까? 당신이 속성에 할당 할 경우

답변

2

, 당신은 등호와 메소드 이름이 필요합니다 또한

f.send("#{percent_field}=", 5) 

이 :

rank_class = klass 
:

rank_class = (klass.name).constantize 

이 동일하다

1

트랜잭션에서 모든 유효한 레코드를 업데이트하기 위해 메소드를 다시 작성합니다.

def self.update_percentages_2(klass, rank_field, percent_field) 
    top_5 = (klass.maximum(rank_field) * 0.05).ceil 
    klass.where("#{rank_field} <= ?", top_5).update_all(percent_field => 5) 
end 

은 BTW 여기

은 원래의 질문에 대한 answer입니다.

관련 문제