2

我有两个模型,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 属性?

4

1 回答 1

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
于 2012-09-06T02:57:00.993 回答