2015-05-14 62 views
1

我有模型,我想設置一個布爾值爲false,只要它被更改。以後我可以重新處理它,以確保相關記錄是最新的。我嘗試了一些東西,但不斷讓自己陷入循環。更新記錄時Rails模型集布爾值

/app/model/contest.rb

class Contest < ActiveRecord::Base 
    has_many :results, dependent: :destroy 

    after_update :set_contest_not_updated 

    def set_contest_not_updated 
    self.contest_updated=false 
    self.save 
    end 

    def set_contest_updated 
    self.update_column(:contest_updated_at, Time.now) 
    self.update_column(:contesy_updated, true) 
    end 

預期的行動:

contest.update_atrributes(flag_that_effects_scoring: true) 

我希望這是上面運行時,contest.contest_updated布爾將被設置爲false,並且只有在contest.set_contest_updated()方法i跑步。

回答

2

當然呼叫saveafter_update回調會讓你陷入循環。它一次又一次地保存,直到時間結束。

但是,before_update應該完成工作。
PS:不要致電save*_save*_update回調。這將永遠讓你陷入循環。

before_update :set_contest_not_updated 

    def set_contest_not_updated 
    self.contest_updated = false 
    end 
0

這行不通當你after_update被調用時,它會調用另一個after_update電話,你會得到堆棧層次過深的消息。

最好的解決方案是在另一個表/模型中有一個foriegn鍵,比如contest_updates。

但是,如果您想要解決方案,請在before_update過濾器中設置標誌