Rails 4:跳过回调

我的应用程序中有拍卖和出价对象,当有人按下BID BUTTON然后调用创建出价的BID CREATE控制器,然后在拍卖对象上做一些其他事情:

BIDS控制器 – >创建

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

拍卖模式

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

所以问题是:在这个特定的@ auction.save中,C如何才能跳过“回调前”

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 

ActiveSupport :: Callbacks :: ClassMethods #skip_callback不是线程安全的,它将删除回调方法的时间直到它被执行,因此另一个线程同时无法获得回调方法来执行。

看看Allerin提供的信息性post – 在轨道应用中保存一个对象跳过的回调

您可以使用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 

要么

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