我有两个班级,一个父母和一个孩子,简化如下。
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
父模型中的调用)。那部分是有道理的。
问题是在这两个验证调用中,我的第三方函数调用都被触发了。就像我第一次通过验证设置属性,但第二次通过验证,对象无法识别其属性已被设置。令人沮丧的部分是调用这个第三方服务需要真正的美元成本,所以我不能无缘无故地重复调用。
如何解决此问题,以便第三方调用仅进行一次,而不管在保存之前验证对象多少次?