Ruby on Rails: uso de la callback para multiplicar dos objetos en tablas separadas cuando se crea una nueva entrada

Tengo 3 tablas, Objetivos, Actividades y Actividades_Actividades. El objective tiene un valor establecido para xp y la actividad toma una entrada del usuario. Al usar el método on_create en la Actividad, me gustaría multiplicar la entrada del usuario con el objective xp y almacenarlo en la tabla de Actividades del objective para poder mantener un registro de cada actualización y, finalmente, agregarlos todos para crear un objective total xp la tabla de goles.

He encontrado un par de preguntas sobre SO, aquí y aquí , que cubren temas similares, pero me resulta difícil entender las asociaciones entre los archivos de modelo y cómo acceder a ciertos métodos en diferentes modelos.

También he leído la documentación sobre devoluciones de llamada que creo que es lo que necesito configurar, pero si hay una mejor manera de hacerlo, hágamelo saber.

Aquí están mis asociaciones modelo en este momento.

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 

actividad.rb

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

Aquí hay un conjunto de valores de ejemplo en las tablas.

Metas

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

Ocupaciones

activity_id: 1, cantidad: 3, goal_id: 1

Goal_activities

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

El total_xp luego se agregaría al total_goal_xp en la tabla de objectives una vez que se haya creado la actividad.

Cualquier consejo sería apreciado. Hazme saber si tienes alguna pregunta.

Puede usar after_create callback en su activity.rb como

 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