has_and_belongs_to_many и уникальный индекс для таблицы ассоциации генерирует ошибку «Duplicate entry» - PullRequest
3 голосов
/ 27 декабря 2011

У меня есть несколько has_and_belongs_to_many ассоциаций, и я также использовал опцию uniq в ассоциациях, чтобы избежать ошибок MySQL в связи с дублированием ключей.Мои ассоциации выглядят так:

has_and_belongs_to_many :people, :uniq => true

Индекс, который я добавил, представляет собой разделенный первичный ключ, который я добавил с помощью:

add_index :table_name, [:key_1, :key_2], :unique => true

с обеих сторон ассоциации.Но когда я пытаюсь связать объект дважды, мое приложение выдает ошибку Mysql2::Error: Duplicate entry '1-9' for key..., которая генерируется MySQL.Есть ли умный способ справиться с этой проблемой?

Я думал о нескольких возможных решениях, но они не умны.Я думал об изменении запроса INSERT вручную, используя опцию :insert_sql, но для 20 ассоциативных таблиц это было бы большой работой.Есть ли лучший способ справиться с этим?

1 Ответ

3 голосов
/ 27 декабря 2011

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

Самое простое - это, вероятно, спасти ActiveRecord::RecordNonUnique и правильно с ним справиться - независимо от того, насколько тщательны ваши проверки уровня рубина, всегда будет шанс возникновения состояния гонки, которое попадет в базу данных

...