2010-03-11 100 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 

,但我想这增添了一分SELECT查询INSERT

我宁愿只有一个INSERT,并且没有错误报告,即使失败(我猜测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 

这是一个有点难看,但工作。考虑收紧正则表达式,除非匹配正确的错误类型。

相关问题