Проверить количество вложенных атрибутов - PullRequest
4 голосов
/ 08 апреля 2010

У меня есть модель с вложенными атрибутами:

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

Работает нормально. Однако я хотел бы быть уверен, что на каждый Foo у меня есть как минимум два бара. Я не могу получить доступ к bar_attributes в моих проверках, поэтому, кажется, я не могу проверить его.

Есть ли какой-нибудь чистый способ сделать это?

Ответы [ 3 ]

7 голосов
/ 08 апреля 2010
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

Контроллер позаботится о построении / обновлении баров, поэтому вам просто нужно посмотреть, достаточно ли у вас.

2 голосов
/ 30 июня 2010

Ответ Тони на самом деле не касается случая, когда существующие бары Фу удаляются.

Поскольку проверка родительского элемента (Foo) происходит до того, как вложенные дочерние элементы (столбцы) будут уничтожены, Foo пройдет проверку, затем столбцы будут уничтожены, и пользователю не будет представлено ошибок.

Я бы добавил это как комментарий, но на данный момент мне не хватает повторений

1 голос
/ 11 января 2012

На всякий случай, если кому-то, видящему это, нужно, чтобы он работал на Rails 3. Я думаю, что add_to_base (который используют Тони и Джереми) был удален, поэтому он должен выглядеть примерно так:

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
...