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中不可用).
救援它
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)
这有点难看,但会奏效.考虑收紧正则表达式除非完全匹配你得到的错误类型.