我有两个模型,User 和 TrainingSession:
class User < ActiveRecord::Base
has_many :training_sessions
end
class TrainingSession < ActiveRecord::Base
belongs_to :user
end
每个用户都有一定数量的积分,基于他们累积的 training_sessions 的持续时间总和(在 TrainingSession 模型中):
class TrainingSession
def points
sum(:duration) / 6
end
目前,在用户创建新的 training_session 后,我正在更新 User 模型中的 points 属性,如下所示(来自 TrainingSession 控制器):
# 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 分钟,他们将获得 10 分,达到 170 分。但是在创建了 60 分钟的运行 training_session 之后,用户模型将其更新为 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 属性?