4

2 つの異なるフィールドについて、モデルで 2 つの異なる計算を行う必要があります。保存前。

Class Event < ActiveRecord::Base
  #some relations
  before_save :method1, unless: :some_field_1?
  before_save :method2, unless: :some_field_2?

  def method1
    some_field_1 = some_other_field / 2
  end

  def method2
    some_field_2 = some_field_1 / 3
  end
end

私が抱えている問題は、method2 が呼び出されたときに some_field_1 が null であることです。私の推測では、私がやっているように before_save コールバックを宣言するのは間違っていると思います。

  • 2 番目の before_save は最初の before_save を上書きしますか?
  • コールバックは宣言された順序で実行されますか?

条件と問題解決なしで 2 つのメソッドを 1 つにラップできることはわかっていますが、条件付きコールバックを使用したいと思います。そして、正しい方法を知りたいです。ドキュメントはこれについてかなり明確ではありません。

どうもありがとう!

編集

今後の参考のために。コードはOKでした。問題は別の場所 (DB) にありました!

4

2 に答える 2

7

2 番目の before_save は最初の before_save を上書きしますか?

いいえ

コールバックは宣言された順序で実行されますか?

はい

属性はブール値ではないため、おそらく疑問符を使用しないでください。試す:

before_save :method1, unless: :some_field_1
before_save :method2, unless: :some_field_2
于 2015-03-20T15:01:53.670 に答える
5

コンマで区切って、同じフィルターで両方を呼び出すことができます。

元。:

before_validation :t1, :t2

def t1; puts "t1"; end    
def t2; puts "t2"; end

私のテストでは、この順序で実行されるようです。

また、ドキュメントから ( http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html ):

コールバックのキャンセル

before_* コールバックが false を返す場合、それ以降のすべてのコールバックと関連するアクションはキャンセルされます。after_* コールバックが false を返す場合、それ以降のコールバックはすべてキャンセルされます。コールバックは通常、最後に呼び出されるモデルのメソッドとして定義されたコールバックを除いて、定義された順序で実行されます。

の前に何かを実行したい場合は、たとえば のbefore_saveように、これらのジョブを実行する前にトリガーされるフィルタの 1 つを設定することができます。after_validation

于 2015-03-20T14:56:35.490 に答える