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

时间:2010-03-11 09:40:23

标签: mysql activerecord

我正在编写处理读/未读消息的代码,使用简单的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

但我想这会在INSERT

之前再添加一个SELECT查询

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

1 个答案:

答案 0 :(得分:5)

拯救它

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

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