2010-03-11 2 views
3

Я пишу код для обработки прочитанных/непрочитанных сообщений с простой таблицей user_id/message_id mysql для обработки состояния чтения/чтения.rails/mysql - как отключить ActiveRecord :: Ошибка StatementInvalid?

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

Reading.create(:user_id => uid, :message_id => mid) 

есть уникальный индекс на user_id/message_id полой комбинацию, поэтому, когда запись в чтениях уже существует, я получаю ActiveRecord :: StatementInvalid ошибки о дубликате записи ,

теперь я мог бы добавить

unless Reading.exists?(:user_id => uid, :message_id => mid) 
Reading.create(:user_id => uid, :message_id => mid) 
end 

, но я себе это добавляет один более ВЫБЕРИТЕ запроса перед INSERT

я предпочел бы иметь только один INSERT, и никаких сообщений об ошибках, даже если это не удается (I Думаю, REPLACE будет лучше, но afaik он недоступен в ActiveRecord).

ответ

5

Спасательные это

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

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

Смежные вопросы