0

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

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模型实例时,我看到我的子验证正在运行两次(一次用于验证/保存该子,一次用于validates_associated父模型中的调用)。那部分是有道理的。

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

如何解决此问题,以便第三方调用仅进行一次,而不管在保存之前验证对象多少次?

4

1 回答 1

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?

参考这个

于 2013-06-12T16:22:10.203 回答