2013-10-18 58 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