Ich habe eine Anwendung, wo ich das Verhalten von zerstören für viele meiner Modelle überschreiben möchte. Der Anwendungsfall besteht darin, dass Benutzer berechtigt sind, einen bestimmten Datensatz zu löschen, aber das Löschen der Zeile aus der Datenbank würde die referenzielle Integrität zerstören, die andere verwandte Modelle betrifft. Beispielsweise könnte ein Benutzer des Systems einen Kunden löschen wollen, mit dem er nicht mehr Geschäfte macht, aber Transaktionen mit diesem Kunden müssen gepflegt werden.Was ist die beste Methode, um das Verhalten von Rails ActiveRecord zu überschreiben?
Es scheint, ich habe mindestens zwei Möglichkeiten:
- Doppelte Daten in die notwendigerweise Modelle effektiv meine Datenmodell Denormalisierung, so dass gelöschte Datensätze nicht bezogenen Daten auswirken wird.
- Überschreiben Sie das "zerstören" Verhalten von ActiveRecord, um etwas zu tun, wie ein Flag setzen, das den Benutzer "löschte" den Datensatz angibt und dieses Flag verwendet, um den Datensatz auszublenden.
Fehle ich einen besseren Weg?
Option 1 scheint für mich eine schreckliche Idee zu sein, obwohl ich gerne Argumente für das Gegenteil hören würde.
Option 2 scheint etwas Rails-ish, aber ich frage mich, der beste Weg, damit umzugehen. Soll ich meine eigene Elternklasse erstellen, die von ActiveRecord :: Base erbt, überschreiben Sie dort die Destroy-Methode, und erben Sie dann von dieser Klasse in den Modellen, in denen ich dieses Verhalten möchte? Sollte ich das Suchverhalten auch außer Kraft setzen, werden die als gelöscht markierten Datensätze nicht standardmäßig zurückgegeben?
Wenn ich das mache, wie würde ich mit dynamischen Findern umgehen? Was ist mit benannten Bereichen?
Danke Matchu. Du hast Recht, ich brauche die Daten nicht mehr zu verwenden, daher ist das Nullen nicht das, wonach ich suche. Während die Einfachheit von Ryans Plugin, das in seiner Antwort erwähnt wird, ansprechend ist, überzeugte mich Ihr Argument dafür, dass ich über das Verhalten explizit bin. Ich schätze die Antwort. –