我正在编写处理读/未读消息的代码,使用简单的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中不可用)。
答案 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
这有点难看,但会奏效。考虑收紧正则表达式,除非要完全匹配你得到的那种错误。