Rails 4:跳过回调

时间:2013-10-18 11:53:17

标签: ruby-on-rails ruby callback

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

BIDS CONTROLLER - > CREATE

@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

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:4)

答案 2 :(得分:4)

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

查看Allerin提供的信息性帖子 - SAVE AN OBJECT SKIPPING CALLBACKS IN RAILS APPLICATION

答案 3 :(得分: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? }