Я пишу код для обработки прочитанных / непрочитанных сообщений, с простой таблицей user_id / message_id mysql для обработки прочитанного / непрочитанного статуса.
когда пользователь просматривает сообщение, я выполняю
Reading.create(:user_id => uid, :message_id => mid)
существует уникальный индекс для комбинации полей user_id / message_id, поэтому, когда запись в Readings уже существует, я получаю ActiveRecord :: StatementInvalid ошибку о дублированной записи.
Теперь я могу добавить
unless Reading.exists?(:user_id => uid, :message_id => mid)
Reading.create(:user_id => uid, :message_id => mid)
end
но я представляю, что это добавляет еще один запрос SELECT перед INSERT
Я бы предпочел иметь только одну ВСТАВКУ и никаких отчетов об ошибках, даже если она не удалась (я думаю, что ЗАМЕНА была бы лучшей, но на самом деле она недоступна в ActiveRecord).