2010-01-13 4 views
2

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

ответ

3

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

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

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

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

Edit 2: Сделка, как это будет даст что-то вроде «ActiveRecord :: StatementInvalid: Mysql :: Ошибка: запись Дублированный«123 'для ключа 1: < sql заявление здесь > "ошибка.

Table.transaction do 
    i1 = Table.new 
    i1.fieldname = "123" 
    i1.save 
    i2 = Table.new 
    i2.fieldname = "123" 
    i2.save 
end 
+0

она до сих пор не работа – PanosJee

+0

какая база данных вы используете. Я просто попытался добавить те же значения в уникальное поле, используя транзакцию, и получил ошибку (используя MYSQL) – Veger

+0

5.1, когда я делаю обычную вставку в оболочку db mysql дает ошибку, как ожидалось – PanosJee

0

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

+0

я уже с помощью: уникальный => верно для поля, которое должно быть уникальным, но и без везения внутри транзакции (это работает, если я сделать простой SQL вставку в командной строке) – PanosJee

Смежные вопросы