Rails: почему сбой validate_uniqeness все еще позволяет сохранять? - PullRequest
1 голос
/ 04 марта 2011

- вопрос переписан на основе дальнейшего тестирования -

Итак, мое приложение имеет много папок, которые принадлежат коллекциям. Папки являются вложенными, они также могут принадлежать_ другой папке.

Я хочу проверить уникальность имен папок в каждой коллекции. Когда я создаю папки на верхнем уровне, это работает, но когда я создаю его на более низких уровнях, это не работает. Вот модели:

class Folder < ActiveRecord::Base
  # CALLBACKS
  before_create :associate_collection

  # RELATIONSHIPS
  belongs_to :collection
  belongs_to :parent, :class_name => 'Folder'
  has_many :subfolders, :class_name => 'Folder', :foreign_key => :parent_id

  # VALIDATIONS
  validates_presence_of :name
  validates_uniqueness_of :name, :scope => :collection_id

  private

  def associate_collection
    if self.collection.nil?
    self.collection = self.parent.collection
    end
  end
end

class Collection < ActiveRecord::Base

  # RELATIONSHIPS
  has_one :root_folder, :class_name => 'Folder', :conditions => { :parent_id => nil }
  has_many :folders

  # CALLBACKS
  after_create :setup_root_folder

  private

  def setup_root_folder
    self.create_root_folder(:name=>'Collection Root')
    self.save!
  end

end

Вот сокращенный пример того, что происходит в консоли:

c = Collection.new(:name=>'ExampleCollection')
#<Collection id: 1>

root = c.root_folder
#<Folder id: 1, collection_id: 1>

f1 = root.subfolders.create(:name=>'Test')
#<Folder id: 2 collection_id: 1> 

f1.valid?
# TRUE

f2 = root.subfolders.create(:name=>'Test')
#<Folder id: 3 collection_id: 1>

f2.valid?
# FALSE

f1.valid?
# FALSE

Таким образом, хотя коллекция правильно связана с подпапкой, она не запускает проверки корректно до тех пор, пока не будет сохранена.

Предложения

Ответы [ 2 ]

1 голос
/ 04 марта 2011

Doh.

Мой associate_collection обратный вызов должен произойти before_validation, а не before_create.

Исправлено.Спасибо за внимание, ребята!

1 голос
/ 04 марта 2011

Единственный способ объяснить это - вызов вызывается до назначения collection_id из-за используемого вами синтаксиса. Может быть, попробуйте

Folder.create(:collection => @collection, :name => 'example')

и посмотрите, изменит ли это что-либо.

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