2013-10-10 29 views
0

我有一個User模型,其中has_many :scoreshas_many上的更新應更新父類上的屬性

如果我添加一個:分給用戶,用戶應該做的playcounter的重新計算:

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列,方法也更復雜,只是在這裏勾勒)

千恩萬謝

回答

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 
+0

嗨安德魯的工作,感謝您的回覆。我有另一種方法解決了我的問題。 – Jan

+0

如果您直接創建樂譜 - 即Score.create(user_id:1,value:123),我認爲您的解決方案不會奏效,因爲它不會更新父項,並觸發用戶級別更新。 –

0

我找到了與

after_create :set_level 

def set_level 
    self.update_attribute :level, calculate_level 
end