2011-11-11 4 views
7

"레일 방식"으로 응용 프로그램을 만들려고합니다. 데이터베이스의 레코드를 소급하여 처리하는 대신, 이번에는 before_save 메서드를 사용하여 수행하려고합니다.before_save에 매개 변수 보내기

def make_percentage_from(score) 
    percent = (score.fdiv(20) * 100) 
    return percent 
end 

데이터베이스에 들어오는 모든 항목의 점수가 20 점 밖에 없으므로 데이터베이스에 저장되기 전에 백분율로 저장하고 싶습니다. 그러나 문제는 내가 보낼 수 없다는 것입니다. before_save를 통해 속성 데이터. make_percentage_from (점수 - 투 - 계산) 나는이 어떻게 할 수있는

:

이상적으로는

before_save이있을 것이다? 그 저장하면이 데이터를 처리해야 할 Google이 아닌 나를 위해 너무 많이 온되지 않고, 내가 결정 해요 (물론이 다른 방법입니다 제공!)

감사와 관련

제프

Widget

답변

9

만약 scorepercentage있는 속성 :

class Widget < ActiveRecord::Base 
    before_validates :calculate_score_percentage 
    validates :percentage, :presence => true 
private 
    def calculate_score_percentage 
    self.percentage = score.fdiv(20) * 100 
    end 
end 

하여 속성/컬럼의 모든 getter와 SETTE 때문에이 작동 ActiveRecord에 의해 자동으로 정의 된 메소드. calculate_score_percentage 메서드의 score에 대한 참조는 실제로 self.score 메서드를 호출하는 것으로 score 개체/값을 반환합니다. self.percentage은 명시 적으로 percent을 사용하는 것이 불분명하기 때문에 명시 적으로 사용해야합니다. 로컬 percentage 변수를 정의하거나 self.percentage=을 호출 할 수 있습니다. 기본값은 이전의 것입니다.이 경우 우리가 원하는 것이 아닙니다.

저는 여기서 유효성 검사를 사용할 수 있음을 보여주기 위해 before_validates을 사용하고 있습니다. 이는 위생 검사에 유용합니다. 유효성 검사를하지 않으려는 경우 코드를 변경하지 않고 before_save에 대해 바꿀 수 있습니다.

+0

우수하고 철저한 응답. –

8

짧은 대답 : 콜백에는 매개 변수가 없습니다. 콜백은 객체 또는 레코드 자체에 대해 작업을 수행한다고 가정합니다. 따라서 매개 변수로 필요한 속성 (데이터베이스에 저장 됨) 또는 인스턴스 변수로 저장할 필요가있는 모든 것.

관련 문제