2013-10-18 135 views
4

我有一個拍賣會,在我的應用程序中的投標對象,當有人按下BID BUTTON它然後調用BID CREATE控制器,它創建的投標,然後做的一些其他的事情拍賣對象:軌道4:跳過回調

BIDS CONTROLLER - >創建

@auction.endtime += @auction.auctiontimer 
@auction.winner = @auction.arewinning 
@auction.save 

拍賣模型

before_update :set_endtime 

def set_endtime 
    self.endtime=self.starttime+self.auctiontimer 
end 

所以,問題是:如何罐體C的「回調之前」只跳過,在這個特定的@ auction.save

+0

所以你不想要執行的回調,如果它是一個新的記錄?還是取決於行動? – phoet

+0

可能的重複[如何避免運行ActiveRecord回調?](http://stackoverflow.com/questions/632742/how-can-i-avoid-running-activerecord-callbacks) – phoet

+1

@phoet我試過了答案但我認爲不能在rails 4 –

回答

7

skip_callback是一個複雜的,而不是顆粒狀的選擇。

我更喜歡使用attr_accessor:

attr_accessor :skip_my_method, :skip_my_method_2 
after_save{ my_method unless skip_my_method } 
after_save{ my_method_2 unless skip_my_method_2 } 

這樣跳過回調時,你可以聲明:

model.create skip_my_method: true # skips my_method 
model.create skip_my_method_2: true # skips my_method_2 
+0

我也使用過這個。其他方法可能會遇到線程問題。 – Dex

+0

考慮你的方法我已經嘗試了稍微不同的解決方案,它與'rails 5'一起工作。 請檢查此答案http://stackoverflow.com/a/42945367/4675524 – Swaps

+0

'skip_callback'以什麼方式不細粒度? –

2

您可以使用update_columns 看到這個http://edgeguides.rubyonrails.org/active_record_callbacks.html#skipping-callbacks

有沒有當你不喜歡的任何特定條件噸有結束時間那麼只需要設置結束時間,如果是,你可以做

def set_endtime 
    if endtime.nil? 
    self.endtime=self.starttime+self.auctiontimer 
    end 
end 

OR

before_update :set_endtime if: Proc.new { |obj| obj.endtime.nil? } 
+0

這是一種方法,但跳過驗證,我只想跳過回調:) –

+0

是否有任何特定的條件,如當你沒有endtime然後只有你需要設置結束時間如果你可以做 def set_endtime if endtime.nil? self.endtime = self.starttime + self.auctiontimer end end – userxyz

+0

以示例更新我的答案 – userxyz

2

的ActiveSupport ::回調:: ClassMethods#skip_callback不是線程安全的,直到被執行,因此它會刪除時間回調的方法,並在同另一個線程時間無法獲得執行的回調方法。

看看這個信息後通過Allerin - SAVE AN OBJECT SKIPPING CALLBACKS IN RAILS APPLICATION