9

アプリケーションにオークションと入札オブジェクトがあります。誰かがBID ボタンを押すと、入札を作成した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

ActiveSupport::Callbacks::ClassMethods#skip_callback はスレッドセーフではありません。実行されるまでの間、コールバック メソッドを削除するため、同時に別のスレッドが実行用のコールバック メソッドを取得することはできません。

Allerin による有益な投稿を見てください - SAVE AN OBJECT SKIPPING CALLBACKS IN RAILS APPLICATION

于 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 に答える