0

親と子の 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 回だけ行われるようにするにはどうすればよいですか?

4

1 に答える 1