Проверка ActiveRecord: связь сохранена, даже если проверка не удалась - PullRequest
2 голосов
/ 11 августа 2011

Ошибки добавляются к объекту ошибки записи, но ассоциации все еще сохраняются.

  class Parent < ActiveRecord::Base
      validate :valid_child?

      #validation methods
      protected
      def valid_child?
         @child_names = Hash.new
         self.children.each do |curr_child|
            if @child_names[curr_child.name].nil?
                @child_names[curr_child.name] = curr_child.name
            else
                errors.add(:base, "child name should be unique for children associated to the parent")
            end
         end
      end
      #associations
      has_and_belongs_to_many :children, :join_table => 'map__parents__children'
 end


#query on rails console

 @parent = Parent.find(1)
 @parent.children_ids = [1, 2]
 @parent.save

1 Ответ

3 голосов
/ 11 августа 2011

Проблема в том, что для существующей записи @parent.children_ids = [1, 2] вступит в силу изменение в базе данных до вызова @parent.save.

Попробуйте использовать validates_associated для проверкидочерние элементы вместо собственной проверки.

Чтобы убедиться, что имена детей уникальны в контексте родителя, используйте validates_uniqueness_of с параметром :scope, чтобы указать уникальностьидентификатор родителяЧто-то вроде:

class Child < ActiveRecord::Base
  belongs_to :parent
  validates_uniqueness_of :name, :scope => :parent
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...