2

注:この質問は、accepts_nested_attributes_for の使用に関して私が持っていた別の質問から生まれました。必要に応じて、追加のコンテキストについてその質問を参照できます。

この質問は、簡単な例で最もよく説明できると思います。

class Foo < ActiveRecord::Base
  has_many :bars, inverse_of: :foo
end

class Bar < ActiveRecord::Base
  validates :foo_id, presence: true

  belongs_to :foo, inverse_of: :bars
end

f = Foo.new()
=> #<Foo id: nil, created_at: nil, updated_at: nil>
b = f.bars.build()
=> #<Bar id: nil, foo_id: nil, created_at: nil, updated_at: nil>
f.save!
=> ActiveRecord::RecordInvalid: Validation failed: Bars foo can't be blank

この問題を解決する簡単な方法はありますか? f最初に保存してからビルドできることはわかっていますbが、私の状況はこの例よりも少し複雑で (上記の質問を参照してください)、可能であればそれを避けたいと思います。

4

2 に答える 2

2

子レコードは親と同時に作成されます。これが検証が失敗する理由であり、子レコードはまだ永続化されていません。それを機能させるには、このようなカスタム検証を記述します

class Foo < ActiveRecord::Base
  has_many :bars
  accepts_nested_attributes_for :bars, :allow_destroy => true

end

class Bar < ActiveRecord::Base
  belongs_to :foo
  validates_presence_of :bar
end
于 2012-08-02T17:15:00.560 に答える
0

コールバックを使用してオブジェクトを作成できます (おそらく before_save?)。ここを参照してください。

于 2012-08-02T17:11:17.953 に答える