Rails 4: Skip callback

2019-02-22 10:08发布

I have an auction and a bid object in my application, when someone presses the BID BUTTON it then calls the BID CREATE controller which created the bid, and then does some other things on the auction object:

BIDS CONTROLLER -> CREATE

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

AUCTION MODEL

before_update :set_endtime

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

So the question is: How can C skip the "before callback" only, in this specific @auction.save

4条回答
走好不送
2楼-- · 2019-02-22 10:23

ActiveSupport::Callbacks::ClassMethods#skip_callback is not threadsafe, it will remove callback-methods for time till it is being executed and hence and another thread at same time cannot get the callback-methods for execution.

Look at the informative post by Allerin - SAVE AN OBJECT SKIPPING CALLBACKS IN RAILS APPLICATION

查看更多
萌系小妹纸
3楼-- · 2019-02-22 10:32

skip_callback is a complicated and not granular option.

I prefer to use an 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 }

That way you can be declarative when skipping a callback:

model.create skip_my_method: true # skips my_method
model.create skip_my_method_2: true # skips my_method_2
查看更多
太酷不给撩
4楼-- · 2019-02-22 10:34

You can use update_columns See this http://edgeguides.rubyonrails.org/active_record_callbacks.html#skipping-callbacks

Is there any specific condition like when you don't have endtime then only you need to set end time if that the you can do

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? }
查看更多
登录 后发表回答