gpt4 book ai didi

ruby-on-rails-3 - 如何在子模型中使用 after_save 回调来更新父模型中的属性?

转载 作者:行者123 更新时间:2023-12-04 05:33:25 24 4
gpt4 key购买 nike

我有两个模型,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 后,我将更新用户模型中的点属性,如下所示(来自 TrainingSession Controller ):
# 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 属性?

最佳答案

@user在您的模型中未定义。这就是您收到错误的原因。

训练类(class)属于用户,因此在您的模型中,您可以通过 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

关于ruby-on-rails-3 - 如何在子模型中使用 after_save 回调来更新父模型中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12292153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com