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
我有 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