rails/mysql - 如何使ActiveRecord :: StatementInvalid错误无声?

Pav*_* K. 3 mysql activerecord

我正在编写一个代码来处理读/未读消息,使用一个简单的user_id/message_id mysql表来处理读/未读状态.

当用户查看消息时,我执行

Reading.create(:user_id => uid, :message_id => mid)
Run Code Online (Sandbox Code Playgroud)

user_id/message_id字段组合中有唯一索引,因此当读数中的条目已经存在时,我得到有关重复条目的ActiveRecord :: StatementInvalid错误.

现在我可以补充一下

unless Reading.exists?(:user_id => uid, :message_id => mid)
 Reading.create(:user_id => uid, :message_id => mid)
end
Run Code Online (Sandbox Code Playgroud)

但我想这会在INSERT之前再添加一个SELECT查询

我宁愿只有一个INSERT,即使它失败也没有错误报告(我猜REPLACE会是最好的,但是afaik它在ActiveRecord中不可用).

ans*_*hul 5

救援它

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

这有点难看,但会奏效.考虑收紧正则表达式除非完全匹配你得到的错误类型.