9

我的应用程序中有一个拍卖和一个出价对象,当有人按下BID BUTTON时,它会调用创建出价的BID 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

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

4

4 回答 4

18

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
于 2016-08-17T13:58:35.243 回答
4

您可以尝试使用 skip_callback 跳过回调

http://www.rubydoc.info/docs/rails/4.0.0/ActiveSupport/Callbacks/ClassMethods:skip_callback

于 2013-10-18T12:40:28.217 回答
4

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

查看 Allerin 的信息性帖子 -在 RAILS 应用程序中保存对象跳过回调

于 2014-01-11T16:16:00.170 回答
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 

或者

before_update :set_endtime if: Proc.new { |obj| obj.endtime.nil? }
于 2013-10-18T12:29:24.137 回答