0

我有一个User模型has_many :scores

如果我向用户添加 :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

当我通过User.score.create(:time => 10)分数添加分数时,会保存但级别没有更新。

set_levels如果有孩子,我该如何重新运行?

(不是countercache列,方法比较复杂,这里只是勾画)

非常感谢

4

2 回答 2

0

我有它的工作

after_create :set_level

def set_level
  self.update_attribute :level, calculate_level
end
于 2013-10-10T16:04:07.463 回答
0

您需要向Score模型添加一个回调,也许是after_commit在分数模型上告诉父User级重新计算级别。

class Score < ActiveRecord::Base
  after_commit do
    # can just call touch, as before_save will calc
    user.touch
  end
end

现在,只有当你想重新计算每个分数时,并且同步。更多时候,我会发送一条消息,例如发送到 resque/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
于 2013-10-10T14:37:56.950 回答