在回调中设置的实例变量被多次设置

时间:2013-06-12 15:51:29

标签: ruby-on-rails ruby-on-rails-3

我有两个班,父母和孩子,简化如下。

class Parent < ActiveRecord::Base
  has_one :child
  accepts_nested_attributes_for :child

  validates :child, :presence => true
  validates_associated :child
end

class Child < ActiveRecord::Base
  belongs_to :parent

  attr_accessible :third_party_attribute

  before_validation :set_attributes
  validates :parent, :presence => true
  validates :third_party_attribute, :presence => true

  def set_attributes
    if self.third_party_attribute.nil?
      self.third_party_attribute = <MAKE THIRD PARTY FUNCTION CALL>
    end
  end
end

当我传入属性(包括子属性)并保存Parent模型实例时,我看到我的Child验证正在运行两次(一次用于验证/保存该子项,一次用于validates_associated调用Parent模型)。那部分是有道理的。

问题是,在这两个验证调用中,我的第三方函数调用都被触发了。这就像我第一次通过验证设置属性,但第二次通过验证,对象无法识别其属性已经设置。令人沮丧的是,调用这个第三方服务有一个真正的美元成本,所以我不能无缘无故地重复打电话。

如何修复此问题,以便第三方调用只进行一次,无论在保存之前验证对象的次数是多少次?

1 个答案:

答案 0 :(得分:0)

试试这个

def set_attributes
  if third_party_attribute.nil?
    self.third_party_attribute = <MAKE THIRD PARTY FUNCTION CALL>
  end
end

请注意,条件为if third_party_attribute.nil?而非self.third_party_attribute.nil?

参考this