Validates_uniqueness_of не работает при выполнении большой транзакции - PullRequest
2 голосов
/ 13 января 2010

У меня есть поле validate_uniqueness_of: внутри моей модели ActiveRecord. Когда я делаю одно создание / обновление, оно работает хорошо, но мне нужно сделать несколько больших партий из CSV-файлов внутри транзакции Когда я нахожусь в транзакции, validate_uniqueness_of не обнаруживает ошибку, и модель сохраняется!

Ответы [ 2 ]

3 голосов
/ 13 января 2010

Может ли быть так, что неуникальные значения создаются во время транзакции?

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

Редактировать: Создать индекс с уникальным свойством, включенным для вашего поля, и транзакция завершится неудачно, что предотвратит добавление неуникальных элементов. Чтобы сделать что-то, вы должны добавить что-то в файл миграции

add_index("tablename", "fieldname", { :name => "fieldname_index", :unique => true })

Редактировать 2: Транзакция, подобная этой, выдаст ошибку типа «ActiveRecord :: StatementInvalid: Mysql :: Error: Дублирующая запись« 123 »для ключа 1: <оператор SQL здесь>».

Table.transaction do
  i1 = Table.new
  i1.fieldname = "123"
  i1.save
  i2 = Table.new
  i2.fieldname = "123"
  i2.save
end
0 голосов
/ 13 января 2010

validates_uniqueness_of зависит от условий гонки, и вам все еще нужно иметь соответствующие уникальные ограничения для вашей базы данных.Вы описываете эту ситуацию .Ссылка предоставляет несколько решений.

...