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),你的解决方案将不起作用,因为它不会更新父级,并触发你的用户级更新。