gpt4 book ai didi

ruby-on-rails - 我可以在没有开始...结束的情况下将重试放在救援 block 中吗?

转载 作者:行者123 更新时间:2023-11-29 12:19:05 25 4
gpt4 key购买 nike

我遇到了一个问题,当 PG 不同步时(众所周知的问题)(example)。

PG 不同步失败,id 序列停止递增并引发 ActiveRecord::RecordNotUnique 错误。

但是这里提出的所有解决方案(所有我发现的)都提出了一些手动解决方案——要么在控制台中执行一些操作,要么运行自定义 rake 任务。

但是,我发现这对于生产来说并不令人满意:每次发生这种情况时,用户都会获得 500,而管理服务器的人应该有效地挽救局面。 (并且根据某些原因的测试数据,在我的情况下可能会经常发生)。

所以我宁愿修补 ActiveRecord 基类来捕获这个特定错误并挽救它。

我有时在 Controller 中使用这个逻辑:

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 是否会理解它要求重试的确切内容。

有什么解决办法吗?

附言对于序列的整体问题的非相关解决方案,无需手动命令行命令即可工作,并且有未服务的用户也很受欢迎。

最佳答案

要回答你问的问题,不。 rescue 只能在 begin..end block 或方法体内使用。

begin
bad_method
rescue SomeException
retry
end

def some_method
bad_method
rescue SomeException
retry
end

rescue_from 只是一个框架辅助方法,因为在 Controller 中的执行是间接的。

当然,要回答您真正问的问题。您可以使用 rescue/retry 覆盖 create_or_update

module NonUniquePkeyRecovery
def create_or_update(*)
super
rescue ActiveRecord::RecordNotUnique => e
raise unless e.message.include? '_pkey'
self.class.connection.reset_pk_sequence!(self.class.table_name)
retry
end
end

ActiveSupport.on_load(:active_record) do
include NonUniquePkeyRecovery
end

关于ruby-on-rails - 我可以在没有开始...结束的情况下将重试放在救援 block 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36680740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com