【发布时间】:2016-04-17 18:48:26
【问题描述】:
当 PG 无法同步时,我遇到了一个问题(众所周知的问题)(example)。
PG 不同步失败,id 序列停止递增并引发ActiveRecord::RecordNotUnique 错误。
但是这里提出的所有解决方案(我发现的所有解决方案)都提出了一些手动解决方案 - 要么在控制台中执行一些操作,要么运行自定义 rake 任务。
但是,我发现这对于生产来说并不令人满意:每次发生这种情况时,用户都会获得 500,而管理服务器的人应该可以节省时间。 (根据测试数据,由于某种原因,在我的情况下可能会经常发生)。
所以我宁愿修补 ActiveRecord 基类来捕捉这个特定的错误并挽救它。
我有时在控制器中使用这个逻辑:
class ApplicationController < ActionController::Base
rescue_from ActionController::ParameterMissing, ActiveRecord::RecordNotFound do |e|
# some logic here
end
end
但是,在这里我不需要重试。另外,我不想深入研究猴子补丁,例如,不覆盖 Base create 方法。
所以我在想这样的事情:
module ActiveRecord
class Base
rescue ActiveRecord::RecordNotUnique => e
if e.message.include? '_pkey'
table =e.message.match(//) #regex to define table
ActiveRecord::Base.connection.reset_pk_sequence!(table)
retry
else
raise
end
end
end
但它很可能不起作用,因为我不确定 Rails/Ruby 是否会理解它要求重试的确切内容。
有什么解决办法吗?
附:对于序列的整体问题的不相关解决方案,无需手动命令行命令和没有服务的用户也可以工作。
【问题讨论】:
标签: ruby-on-rails postgresql activerecord