在Rails 4上注册多个before_save条件回调

时间:2015-03-20 14:48:25

标签: ruby-on-rails ruby-on-rails-4 activerecord 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是否会覆盖第一个?
  • 回调是否按照声明它们的相同顺序执行?

我知道我可以在没有条件和问题解决的情况下将这两个方法包装成一个,但我更愿意进行条件回调。我想知道正确的做法。文档对此并不十分清楚。

非常感谢!

修改

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

2 个答案:

答案 0 :(得分:6)

  

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

没有

  

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

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

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

答案 1 :(得分: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 之前完成之后的事情,你可能想要设置一个之前触发的过滤器,例如,after_validation来做这些工作。