나는이 두 가지 모델, 사용자 및 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 속성을 최신 상태로 유지합니까?
정말 고마워요. 그 협회에 대해 더 생각할 필요가 있습니다! – kwyoung11