4

I have a model with nested attributes :

class Foo < ActiveRecord::Base
    has_many :bar
    accepts_nested_attributes_for  :bar
end

It works fine. However I'd want to be sure that for every Foo, I have at least two Bar. I can't access the bar_attributes in my validations so it seems I can't validate it.

Is there any clean way to do so ?

4

3 に答える 3

7
class Foo < ActiveRecord::Base
  has_many :bars
  accepts_nested_attributes_for  :bar

  def validate
    if self.bars.reject(&:marked_for_destruction?).length < 2
      self.errors.add_to_base("Must have at least 2 bars")
    end
  end
end

コントローラーがバーの作成/更新を処理するので、十分にあるかどうかを確認するだけで済みます。

于 2010-04-07T21:17:56.760 に答える
2

トニーの答えは、実際には既存のFoo のバーが削除され た場合を処理しません。

ネストされた子 (バー) が破棄される前に親 (Foo) の検証が行われるため、Foo は検証に合格し、バーは破棄され、ユーザーにエラーは表示されません。

これをコメントとして追加しますが、現時点では十分な担当者がいません

于 2010-06-30T19:32:10.297 に答える
1

これを見た人がRails3で動作する必要がある場合に備えて、add_to_base(TonyとJeremyが使用)が削除されたと思うので、次のようにする必要があります。

class Foo < ActiveRecord::Base
  has_many :bars
  accepts_nested_attributes_for  :bar

  def validate
    if self.bars.reject(&:marked_for_destruction?).length < 2
      self.errors.add(:base, "Must have at least 2 bars")
    end
  end
end
于 2012-01-11T19:03:54.503 に答える