J'essaie d'implémenter une piste d'audit dans mon application, mais en raison de certaines exigences, je suis incapable d'utiliser des gemmes ou des plugins existants.Mise à jour d'enregistrement actif de surcharge et de contournement
Je souhaite rediriger toute tentative normale de mise à jour d'un modèle vers une méthode personnalisée qui enregistre toutes les mises à jour dans une autre table distincte (appelée Mises à jour).
L'application utilise ensuite la table de mise à jour pour réellement effectuer la mise à jour.
create_or_update En ce moment je suis surchargé pour obtenir la première partie de la fonctionnalité
def create_or_update
raise ReadOnlyRecord if readonly?
result = new_record? ? create : create_updates
result != false
end
class Update < ActiveRecord::Base
belongs_to :updatable, :polymorphic => true
after_create :update_model
private
def update_model
self.updatable.update_attribute self.attribute, self.new_value #infinite loop
end
end
La question est maintenant que cela provoque une boucle infinie lorsque le modèle de mise à jour tente d'effectuer réellement la mise à jour.
J'ai regardé à travers la source principale de rails pour trouver le meilleur endroit pour contourner la fonctionnalité de la première caractéristique. Je voudrais que ces mises à jour soient effectuées à l'intérieur de la transaction, mais je ne sais pas exactement où cela commence ou finit dans la pile d'enregistrements active. Je ne veux pas non plus commencer à pirater des ressources actives.
Toutes les suggestions seraient grandement appréciées.
Ceci est proche de la fonctionnalité sauf que les mises à jour sont pré-approuvées. J'ai considéré quelque chose comme ceci mais je ne pense pas que cette solution attrapera toutes les mises à jour. Par exemple, update_attributes contournerait également UpdateAuditor. – stellard
J'ai fait le changement que vous avez demandé, cependant, s'il vous plaît lire mon commentaire près du fond. –
Merci beaucoup pour votre réponse. Je suis d'accord que l'écrasement de la méthode de mise à jour par défaut peut être dangereux mais je ne sais pas comment je peux accomplir exactement ce que je veux faire en utilisant un callback before_update. Comment puis-je arrêter la mise à jour après avoir créé un UpdateAudit sans me comporter de la même manière qu'une mise à jour échouée? – stellard