在Rails4上注册多个before_save条件回调



我要对两个不同字段的模型进行两次不同的计算。保存之前。

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回调是错误的。

  • 第二个before_save是否覆盖第一个
  • 回调的执行顺序是否与它们的声明顺序相同

我知道我可以将这两个方法组合为一个,而不需要条件和问题求解,但我更喜欢有条件回调。我想知道正确的方法。医生对此不太清楚。

非常感谢!

编辑

供日后参考。代码还可以。问题出在其他地方(数据库)!

第二个before_save是否覆盖第一个?

回调的执行顺序是否与它们的声明顺序相同?

由于您的属性不是布尔值,您可能不应该使用问号。尝试:

before_save :method1, unless: :some_field_1
before_save :method2, unless: :some_field_2

您可以在同一个筛选器上调用它们,用逗号分隔。

示例:

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,所有以后的回调都被取消回调通常在它们的定义顺序,但回调定义为方法,称为last

如果您希望在before_save之前完成,则可能需要设置在它之前触发的一个筛选器,例如after_validation,以执行这些作业。

最新更新