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子がアタッチされている場合、どうすれば再実行できますか?

(これはカウンターキャッシュ列ではなく、より複雑な方法です。ここでスケッチしただけです)

どうもありがとう

4

2 に答える 2

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 に答える
0

私はそれで動作しています

after_create :set_level

def set_level
  self.update_attribute :level, calculate_level
end
于 2013-10-10T16:04:07.463 に答える