rails / mysql - как заставить замолчать ActiveRecord :: StatementInvalid ошибка? - PullRequest
3 голосов
/ 11 марта 2010

Я пишу код для обработки прочитанных / непрочитанных сообщений, с простой таблицей 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).

1 Ответ

5 голосов
/ 11 марта 2010

Спасите его

begin
  Reading.create(:user_id => uid, :message_id => mid)
rescue ActiveRecord::StatementInvalid => error
  raise error unless error.to_s =~ /Mysql::Error: Duplicate/
end

Это немного некрасиво, но сработает. Подумайте об ужесточении регулярных выражений, если вы не хотите точно указать тип ошибки, которую вы получаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...