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

Posted

技术标签:

【中文标题】rails/mysql - 我如何消除 ActiveRecord::StatementInvalid 错误?【英文标题】:rails/mysql - how do i silence out ActiveRecord::StatementInvalid error? 【发布时间】:2010-03-11 09:40:23 【问题描述】:

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

拯救它

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

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

【讨论】:

以上是关于rails/mysql - 我如何消除 ActiveRecord::StatementInvalid 错误?的主要内容,如果未能解决你的问题,请参考以下文章

Rails、MySQL 和雪豹

Rails + MySQL 中的发票编号

如何正确编写我的 clickhouse sql 查询?

Rails MySQL 查询时间混乱

Rails 4.2 MySQL 5.6 Elastic Beanstalk YAML 语法错误

Rails:“Mysql2::Error: Incorrect string value:”尝试保存“params.inspect”时