validates_uniqueness_of в уничтоженных вложенных образцовых направляющих

У меня есть модель 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"}}

Проверка на задаче сделана прежде, чем уничтожить старую задачу. Следовательно сбои проверки. Какая-либо идея, как проверить таким образом, что она не полагает, что задача уничтожается?

18
задан cweston 19 April 2016 в 19:08
поделиться

2 ответа

Эндрю Франс создал патч в этом потоке , где проверка выполняется в памяти.

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
16
ответ дан 30 November 2019 в 09:06
поделиться

Ref this

Почему бы вам не использовать :scope

class Task < ActiveRecord::Base
  validates_uniqueness_of :name, :scope=>'project_id' 
end

это создаст уникальную задачу для каждого проекта.

-3
ответ дан 30 November 2019 в 09:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: