【问题标题】:Rails 4: Skip callbackRails 4:跳过回调
【发布时间】:2013-10-18 11:53:17
【问题描述】:

我的应用程序中有一个拍卖和一个出价对象,当有人按下 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 如何只跳过“回调之前”

【问题讨论】:

标签: ruby-on-rails ruby callback


【解决方案1】:

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

【讨论】:

  • 我也用过这个。其他方法可能会遇到线程问题。
  • 考虑到您的方法,我尝试了与rails 5 略有不同的解决方案。请检查这个答案stackoverflow.com/a/42945367/4675524
  • skip_callback 不细化的原因是什么?
【解决方案2】:

【讨论】:

【解决方案3】:

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

查看 Allerin 的内容丰富的帖子 - SAVE AN OBJECT SKIPPING CALLBACKS IN RAILS APPLICATION

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 这是一种跳过验证的方法,我只想跳过回调:)
    • 是否有任何特定条件,例如当您没有 endtime 时,如果 endtime.nil 可以执行 def set_endtime,则只需设置结束时间? self.endtime=self.starttime+self.auctiontimer 结束结束
    • 用例子更新我的答案
    • 这是保存/更新回调的正确答案!
    猜你喜欢
    • 1970-01-01
    • 2016-10-29
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多