У меня есть модель Project, которая принимает вложенные атрибуты для Задачи.
class Project < ActiveRecord::Base
has_many :tasks
accepts_nested_attributes_for :tasks, :allow_destroy => :true
end
class Task < ActiveRecord::Base
validates_uniqueness_of :name end
Проверка уникальности в модели Task дает проблему при обновлении Проекта.
В редактировании проекта я удаляю задачу T1 и затем добавляю новую задачу с тем же именем T1, проверка уникальности ограничивает сохранение Проекта.
параметрические усилители хешируют взгляд что-то как
task_attributes => { {"id" =>
"1","name" => "T1", "_destroy" =>
"1"},{"name" => "T1"}}
Проверка на задаче сделана прежде, чем уничтожить старую задачу. Следовательно сбои проверки. Какая-либо идея, как проверить таким образом, что она не полагает, что задача уничтожается?
Эндрю Франс создал патч в этом потоке , где проверка выполняется в памяти.
class Author
has_many :books
# Could easily be made a validation-style class method of course
validate :validate_unique_books
def validate_unique_books
validate_uniqueness_of_in_memory(
books, [:title, :isbn], 'Duplicate book.')
end
end
module ActiveRecord
class Base
# Validate that the the objects in +collection+ are unique
# when compared against all their non-blank +attrs+. If not
# add +message+ to the base errors.
def validate_uniqueness_of_in_memory(collection, attrs, message)
hashes = collection.inject({}) do |hash, record|
key = attrs.map {|a| record.send(a).to_s }.join
if key.blank? || record.marked_for_destruction?
key = record.object_id
end
hash[key] = record unless hash[key]
hash
end
if collection.length > hashes.length
self.errors.add_to_base(message)
end
end
end
end
Ref this
Почему бы вам не использовать :scope
class Task < ActiveRecord::Base
validates_uniqueness_of :name, :scope=>'project_id'
end
это создаст уникальную задачу для каждого проекта.