Ruby on Rails - 在创建新条目时使用回调将两个对象相乘在单独的表中

Ruby on Rails - Using callback to multiply two objects in separate tables when new entry is created

我有 3 个 table、目标、活动和 Goal_Activities。目标有一个 xp 的设定值,Activity 接受用户的输入。使用 Activity 中的 on_create 方法,我想将用户输入与目标 xp 相乘并将其存储在目标活动 table 中,这样我就可以记录每次更新和最终将它们全部加在一起,在目标 table.

中创建一个总目标 xp

我发现了几个关于 SO here and 的问题,它们涵盖了类似的主题,但我发现很难理解模型文件之间的关联以及如何访问某些方法在不同的模型中。

我还阅读了关于 callbacks 的文档,我认为这是我需要设置的内容,但如果有更好的方法,请告诉我。

这是我目前的模型关联。

goal.rb

class Goal < ActiveRecord::Base
  has_many :goal_activities
  has_many :activities, through: :goal_activities
end

goal_activity.rb

class GoalActivity < ActiveRecord::Base
  belongs_to :goal
  belongs_to :activity
end

activity.rb

class Activity < ActiveRecord::Base
  has_many :goal_activities
  belongs_to :goal, through: :goal_activities
end

这是 table 中的一组示例值。

目标

goal_id: 1, xp: 500, total_goal_xp: default 0

活动

activity_id: 1, quantity: 3, goal_id: 1

Goal_activities

goal_activity_id: 1, goal_id: 1, activity_id: 1, total_xp: 1500

创建 activity 后,total_xp 将被添加到目标 table 中的 total_goal_xp。

如有任何建议,我们将不胜感激。如果您有任何问题,请告诉我。

您可以在 activity.rb 中使用 after_create 回调作为

after_create :set_total_xp

private

def set_total_xp
  goal_activity = self.goal_activities.where(goal_id: goal_id).first_or_initialize
  goal_activity.update_attribute(:total_xp, (quantity*goal.xp))
end