Что сказал Ури Агасси,
в большинстве случаев просто уникальный валидатор рельсам будет делать и уникальное ограничение будет просто дать вам больше головной боли, если применяется по умолчанию, так как они могут привести к регрессии на уровне базы данных,
однако, для остальных 1% случаев единственный способ справиться с этим надежно - с уникальным ограничением в e. В основном:
- поставить ограничение уникальности на
msg_id
колонки
- попытку вставить два же
msg_id
через консоль, посмотрит, какие исключения происходит, обратите внимание на класс исключения и сообщение об исключении, выяснить, как отличить msg_id
уникальные ошибки ограничений из других уникальных ошибок ограничений
- и затем сделать спасательный блок для него, что делает обновление или что-то в этих строках
Шаг 3 на Oracle, например, с помощью вам нужно спасти соответствующий класс исключения, а затем проверить, соответствует ли сообщение об исключении уникальному ограничению соответствующего столбца, например e.message =~ /I_MSG_ID_UNIQUE_CONSTRAINT/
Точный код будет зависеть от конкретной базы данных, но в значительной степени этот рабочий процесс
что вы имеете в виду то же самое msg_id? Вы когда-нибудь использовали уникальный столбец msg_id в db? –
Это не имеет никакого отношения к мьютексам, которые используются для предотвращения одновременного доступа нескольких потоков к общему ресурсу. Это не будет препятствовать выполнению кода дважды, если 'index' вызывается дважды. –
Просто добавьте уникальный индекс в 'msg_id', а затем поймайте исключение в' save! '(Или' create! 'Вместо' new'/'save!') –