mysql - rails/mysql - 我如何消除 ActiveRecord::StatementInvalid 错误?

标签 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 最好,但据我所知,它在 ActiveRecord 中不可用)。

最佳答案

拯救它

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

这有点难看,但会起作用。考虑收紧 unless 中的正则表达式以准确匹配您遇到的错误类型。

关于mysql - rails/mysql - 我如何消除 ActiveRecord::StatementInvalid 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2423885/

相关文章:

mysql - 喜欢但按 ID 排除一篇帖子?

ruby-on-rails - 为什么 ActiveRecord::StatementInvalid 在这个 Rails 方法中无法拯救?

SQL:在一条语句中插入多组值?

java - 添加到表后读取数据返回零

mysql - SQL创建类别路径/树/层次结构

ruby-on-rails - 检查多插入事务是否成功

ruby-on-rails - 升级到 Rails 3.2.2 : How to solve the 'undefined method for Syck::DomainType' error related to the Delayed Job gem?

ruby-on-rails - 在 Rails 中,如何运行加载 rails 环境的脚本?

mysql - as_json 忽略 .where() 子句的第二部分

Mysql - 备份部分数据