У меня есть две модели / таблицы Rails, которые я хочу вставить как часть транзакции.
Например, вот примерно мои таблицы:
- Сообщений: (id)
- Комментарии: (id, post_id, comment_text, user_id)
- Комментаторы: (id, post_id, user_id), уникальное ограничение на (post_id, user_id)
Прямо сейчасЯ пытаюсь примерно эквивалентно:
ActiveRecord::Base.transaction do
Comment.create!(post: post, user: user, comment_text: '...')
begin
Commenters.find_or_create_by!(post: post, user: user)
rescue PG::UniqueViolation
end
end
Это работает 99,9% времени, но иногда два одновременных комментария вызовут PG :: UniqueViolation.
Даже если я ловлю иподавляя PG :: UniqueViolation, вся транзакция завершается неудачно из-за:
ОШИБКА: текущая транзакция отменяется, команды игнорируются до конца блока транзакции
Я понимаю, что могуже достигли этого, присоединившись к таблице Post и Comment, но это упрощенный пример.
Существует ли более простой способ гарантировать, что обе вставки выполняются как часть транзакции, при этом игнорируя уникальное нарушение, поскольку мы можем предположить, чточто запись уже существует?