2012-09-06 5 views
2

나는이 두 가지 모델, 사용자 및 TrainingSession :자식 모델의 after_save 콜백을 사용하여 부모 모델의 특성을 업데이트하는 방법?

class User < ActiveRecord::Base 
has_many :training_sessions 
end 

class TrainingSession < ActiveRecord::Base 
belongs_to :user 
end 

각 사용자가 (TrainingSession 모델) 축적 된 training_sessions의 지속 시간의 합을 기준으로 의 특정 번호 :

class TrainingSession 
def points 
    sum(:duration)/6 
end 

현재 사용자가 새 training_session을 만든 후에 TrainingSession 컨트롤러에서 다음과 같이 User 모델의 points 속성을 업데이트합니다.

# POST /training_sessions 
# POST /training_sessions.json 
def create 
@user = User.find_by_id(session[:user_id]) 
@training_session = @user.training_sessions.new(params[:training_session]) 
@points = @user.training_sessions.points 
@user.update_attribute(:points, @points) 
... 

문제는 training_session을 만들 때마다 가장 최근에 생성 된 training_session에서 방금 발생한 점수를 포함하지 않는 것입니다. 예를 들어 사용자의 점수가 160 점인 경우 60 분 동안 실행하면 170 점에 도달하기 위해 10 점을 얻게됩니다. 그러나 60 분 동안 training_session을 실행 한 후 User 모델은이를 160 포인트로 업데이트합니다. 따라서 항상 한 발 뒤로 물러나 있습니다. 그래서처럼 TrainingSession 모델 상에 after_save 콜백을 사용하여 시도 :

class TrainingSession < ActiveRecord::Base 
after_save :update_points 

private 

def update_points 
count = @user.training_sessions.sum(:duration) 
if count >= 1 
    points = count/6 
end 
@user.update_attribute(:points, points) 
end 

을하지만, 새로운 training_session 만들려고 할 때 나는이 오류가 :

undefined method `training_sessions' for nil:NilClass 

그래서, 내 질문은, 어떻게

를 수행하십시오 가장 최근에 생성 된 training_session이 포함 된 내 사용자 모델에서 : points 속성을 최신 상태로 유지합니까?

답변

3

@user은 모델에서 정의되지 않았습니다. 그래서 당신은 오류가 발생합니다.

교육 세션은 사용자에게 속하므로 모델에서 self.user 또는 간단히 user을 통해 사용자를 얻을 수 있습니다. 이 코드는 작동해야합니다 :

def update_points 
    count = self.user.training_sessions.sum(:duration) 
    points = count/6 if count >= 1 
    self.user.update_attribute(:points, points) 
end 
+0

정말 고마워요. 그 협회에 대해 더 생각할 필요가 있습니다! – kwyoung11

관련 문제