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