1

このように定義された 2 つのモデルがあるとしましょう。一方のモデルには、親 (所有者) の条件をチェックするカスタム検証があります。例で使用しているものだけでなく、親の任意の条件である可能性があります。

class Project < ActiveRecord::Base
  has_and_belongs_to_many :phrases
end

class Phrase < ActiveRecord::Base
  has_and_belongs_to_many :projects

  validate do
    if self.projects.size == 0
      errors.add(:base, "Must have at least one parent project")
    end
  end
end

次に、新しいプロジェクトを作成した後、その下に新しいフレーズを作成したいと思います。

project = Project.create!(:name => "My Project")
phrase = project.phrases.create!(:value => "My phrase")

検証を実行すると、実際には結合テーブルに行が作成されず、phrase保存されません。期待どおり、検証は失敗します。

問題は次のとおりです。ブロックProject内の親インスタンスにアクセスするにはどうすればよいですか? validate私は電話しているので、「この特定の親の子としてproject.phrases.create!新しいを作成する」と明示的に言っています。アクセスする方法はありますか?ActiveRecord アソシエーションはメソッドを提供しますが、私が知る限り内部では利用できません。PhraseProjectownervalidate

前もって感謝します!

4

1 に答える 1

1

inverse_of を使用すると、既にメモリ内にあるオブジェクトを知るのに役立ちます。

http://gsusmonzon.blogspot.in/2011/09/rails-power-of-inverseof.html

編集: SOに関する同様の質問: Rails::inverse_ofおよびAssociation extensions

于 2013-03-01T08:04:26.010 に答える