Ich stieß auf ein Problem, wenn PG nicht synchron ist (bekanntes Problem) (example).Kann ich den Rettungsblock erneut starten, ohne zu beginnen ... Ende?
PG versagt nicht synchron, die Sequenz der ID wird erhöht und der Fehler ActiveRecord::RecordNotUnique
wird ausgelöst.
Aber alle hier vorgeschlagenen Lösungen (alles, was ich gefunden habe) vorschlagen einige manuelle Lösungen - entweder einige Operationen in der Konsole, entweder benutzerdefinierte Rake-Task ausführen.
Allerdings finde ich dies unbefriedigend für die Produktion: Jedes Mal, wenn es passiert, erhalten Benutzer 500, während jemand, der Server verwaltet, den Tag operativ retten sollte. (Und nach Testdaten aus irgendeinem Grund wird es in meinem Fall häufig vorkommen).
Also ich möchte lieber ActiveRecord Base-Klasse Patch, um diesen spezifischen Fehler zu fangen und es zu retten.
Ich benutze diese Logik manchmal in der Steuerung:
class ApplicationController < ActionController::Base
rescue_from ActionController::ParameterMissing, ActiveRecord::RecordNotFound do |e|
# some logic here
end
end
aber hier sind Wiederholungs nicht brauchen. Außerdem möchte ich zum Beispiel nicht tief in Affepatching gehen, ohne die Base create-Methode zu überschreiben.
So wie ich das an etwas gedacht:
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
Aber es höchstwahrscheinlich nicht funktioniert, wie ich bin nicht sicher, ob Rails/Ruby verstehen, was genau es erneut zu versuchen gefragt.
Gibt es eine Lösung?
P.S. Eine nicht verwandte Lösung für das Gesamtproblem der Sequenz, die ohne manuelle Befehlszeilenbefehle arbeitet und nicht reservierte Benutzer hat, wird ebenfalls geschätzt.