Activerecord 更新有很多应该更新父类的属性
我有一个Activerecord 更新有很多应该更新父类的属性,activerecord,ruby-on-rails-3.2,Activerecord,Ruby On Rails 3.2,我有一个用户模型,有很多:分数 如果我向用户添加:score,用户应重新计算播放计数器: class User < ActiveRecord::Base has_many :scores, inverse_of: :user accepts_nested_attributes_for :scores attr_accessible :level before_save: set_levels def set_levels self.level = ca
用户
模型,有很多:分数
如果我向用户添加:score,用户应重新计算播放计数器:
class User < ActiveRecord::Base
has_many :scores, inverse_of: :user
accepts_nested_attributes_for :scores
attr_accessible :level
before_save: set_levels
def set_levels
self.level = calculate_level
end
def calculate_level
self.scores.count
end
end
class用户
当我通过User.score.create(:time=>10)添加分数时,
分数已保存,但级别未更新
如果连接了子级,如何重新运行set\u levels
(它不是countercache列,它更复杂,只是在这里略图)
非常感谢您需要向
评分
模型添加一个回调,可能是在评分模型上的提交
后,告诉家长用户
重新计算等级
class Score < ActiveRecord::Base
after_commit do
# can just call touch, as before_save will calc
user.touch
end
end
class分数
现在,只有当你想同步地重新计算每一个分数时,这才是正确的。
更多时候,我会发布一条消息,比如回复/sidekiq,这样我的分数创建/更新很快
class Score < ActiveRecord::Base
after_commit do
UpdateUserLevelWorker.perform_async(user_id)
end
end
class UpdateUserLevelWorker
include Sidekiq::Worker
def perform(user_id)
# can just call touch, as before_save will calc
User.find(user_id).touch
end
end
class分数
我已经准备好了
after_create :set_level
def set_level
self.update_attribute :level, calculate_level
end
嗨,安德鲁,谢谢你的回复。我有另一种方法解决了我的问题。我认为如果你直接创建分数-即score.create(user_id:1,value:123),你的解决方案将不起作用,因为它不会更新父级,并触发你的用户级更新。