Проверка моделей по родительской модели - PullRequest
4 голосов
/ 12 апреля 2011

У меня есть две модели: одна является родительской для другой, а родительский принимает accept_nested_attributes_for и validates_associated дочерние.

Однако некоторые из моих проверок имеют: если нужно проверить одно из свойств родителя.

Я думал, что мог бы сделать что-то вроде этого:

validates_presence_of :blah, :if => Proc.new{|thing| thing.parent.some_value.present?}

Тем не менее, отношения «родитель», по-видимому, не устанавливаются во время проверки (я бы предположил, что дети сначала будут созданы и проверены.

Поэтому есть ли способ сделать то, о чем я думаю? Возможно ли это?

Ответы [ 3 ]

1 голос
/ 12 апреля 2011

Вы можете использовать обратные вызовы before_update или before_create в соответствии с вашими потребностями, как это ..

def before_update
  self.errors.add("Error Message") if self.parent.some_value.present?
  return false if self.errors.count > 0
end

def before_create
  self.errors.add("Error Message") if self.parent.some_value.present?
  return false if self.errors.count > 0
end
0 голосов
/ 30 марта 2013

Используйте параметр :inverse_of для связи с родителем, чтобы у детей была ссылка на родителя при построении.

class Parent < ActiveRecord::Base
  has_many :children, :inverse_of => :parent
  accepts_nested_attributes_for :children
end

class Child < ActiveRecord::Base
  belongs_to :parent
end

p = Parent.new :children_attributes => { 0 => { :child_attribute => 'value' } }
p.children.first.parent #=> shouldn't be nil anymore
0 голосов
/ 12 апреля 2011

Этот вид проверки должен работать:

validates_associated: дети

Но это не будет

Причина, насколько я понимаю, из-за того, что acceptes_nested_attributes_for создает вложенные объекты прямо в базу данных через одну транзакцию без прохождения дочерних проверок.

Что вы можете сделать здесь: написать свою собственную проверку в родительской модели и проверить создание дочерних объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...