Проверка уникальности записи с областью, не работает должным образом при сохранении вложенных записей - PullRequest
1 голос
/ 01 апреля 2019

У меня есть модель User с отношением «многие ко многим» к Book через UserBook. Чтобы создать новые отношения, пользователь может:

  1. Выберите из списка доступных книг
  2. Создайте новый запрос книги, введя код ISBN (который можно использовать для поиска книги), они могут подать несколько запросов одновременно

Я бы хотел запретить кому-либо создавать дубликаты в модели UserBook, поэтому я сделал:

class UserLocation < ApplicationRecord
  belongs_to :user
  belongs_to :book

  validates_uniqueness_of :book_id, scope: :user_id
end

Это прекрасно работает, когда пользователь пытается ввести book_id книги, которая уже существует, но возвращается с ошибкой. (Я могу жить с этим)

Настоящая проблема возникает, когда кто-то печатает тот же book_id дважды, что и новая книга. Это создает две записи UserLocation без каких-либо ошибок.

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

Я бы хотел предотвратить исправление этого в контроллере, поэтому не буду искать ответы, которые предлагают, например, дедуплицировать массив.

1 Ответ

3 голосов
/ 01 апреля 2019

Это про условия гонки.

проверьте секцию параллелизма в этой документации

, вы можете избежать добавления уникального индекса, например

add_index :user_locations, :book_id, [ :user_id, :book_id ], unique: true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...