親と子の 2 つのクラスがあり、以下に簡略化しています。
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
モデル インスタンスを保存すると、子の検証が 2 回実行されていることがわかります (その子の検証/保存用に 1 回validates_associated
、親モデルの呼び出し用に 1 回)。その部分は理にかなっています。
問題は、これらの検証呼び出しの両方で、サード パーティの関数呼び出しがトリガーされていることです。1 回目の検証で属性を設定したようですが、2 回目の検証では、オブジェクトはその属性が既に設定されていることを認識しません。苛立たしいのは、このサードパーティのサービスを呼び出すには実際の費用がかかることです。そのため、理由もなく重複した呼び出しを行うことはできません。
オブジェクトが保存前に検証される回数に関係なく、サードパーティの呼び出しが 1 回だけ行われるようにするにはどうすればよいですか?