【问题标题】:rails/mysql - how do i silence out ActiveRecord::StatementInvalid error?rails/mysql - 我如何消除 ActiveRecord::StatementInvalid 错误?
【发布时间】: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 中不可用)。

【问题讨论】:

    标签: mysql 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
    

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

    【讨论】:

      猜你喜欢
      • 2013-06-07
      • 1970-01-01
      • 2013-10-31
      • 2013-09-06
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多