我要对两个不同字段的模型进行两次不同的计算。保存之前。
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
,以执行这些作业。