Ich weiß, dass dies wahrscheinlich irgendwo im Internet ist, aber ich kann die Antwort hier auf Stackoverflow nicht finden, also dachte ich, ich könnte die Wissensbasis hier ein wenig erweitern.
Ich bin ein Neuling bei Ruby and Rails, aber meine Firma investiert ziemlich viel in sie und ich versuche, sie etwas genauer kennenzulernen.
Es war schwierig für mich, meine Einstellung dahingehend zu ändern, dass eine Anwendung aus dem "Modell" und nicht aus der Datenbank entworfen wurde. Daher versuche ich herauszufinden, wie die gesamte Entwurfsarbeit, die ich klassisch in der Datenbank in der Datenbank ausgeführt habe, ausgeführt werden würde Schienenmodell stattdessen.
Die letzte Aufgabe, die ich mir gestellt habe, besteht darin, herauszufinden, wie ein Rails-Datenbankmodell für kaskadierende Löschvorgänge konfiguriert werden kann. Gibt es eine einfache Möglichkeit, dies zu tun? Oder müsste ich in MySql gehen und dies einrichten?
quelle
:delete_all
und dafür verstehen:destroy
. Beides führt dazu, dass untergeordnete Mitgliedschaften (1 Ebene zum Löschen [Zitieren erforderlich] undn
zum Zerstören (wenn ihre Kinder abhängige Zerstörungen haben)) aus der Datenbank entfernt:destroy
werden, instanziieren jedoch jedes untergeordnete Objekt und führen zuerst alle Rückrufe aus, während a:delete_all
direkt ausgeführt wird SQL DELETE-Anweisung in der Datenbank.:destroy
ist aus diesem Grund langsamer, ermöglicht jedoch Rückrufe, wenn ein Datensatz zerstört wird. Umgehung von Schienen an einem Ende und mögliche n ^ x Instanziierung am anderen Ende.Ja, Sie können, wenn Sie eine Beziehung wie has_many verwenden, tun Sie dies einfach
quelle
Im Gegensatz zu der bereitgestellten Antwort empfehle ich dringend, dies auch auf Datenbankebene zu tun. Wenn Sie unterschiedliche Prozesse oder eine Umgebung mit mehreren Threads haben, kann es vorkommen, dass Datensätze nicht ordnungsgemäß gelöscht werden. Darüber hinaus beschleunigt der Datenbank-Fremdschlüssel das Löschen vieler Daten erheblich.
Wie in der vorgeschlagenen Antwort tun Sie dies:
Stellen Sie jedoch auch sicher, dass Sie eine
foreign_key
in einer Migration einrichten. Auf diese Weise sorgt die Datenbank dafür, dass die Datensätze automatisch für Sie gelöscht werden.So annullieren Sie die Werte, wenn eine Mitgliedschaft gelöscht wird, vorausgesetzt, Sie haben ein Benutzermodell:
Sie können auch alle Modelle löschen, wenn eine Mitgliedschaft gelöscht wird
quelle
delete_all
im Modell einrichten . Der Fremdschlüssel sorgt dafür, dass auf Datenbankebene alles für Sie ordnungsgemäß gelöscht wird.Denken Sie daran, dass delete_all keine Rückrufe (wie before_destroy und after_destroy) für die untergeordneten Datensätze ausführt.
quelle
Es sieht so aus, als ob dieses Plugin Ihnen das bietet, wonach Sie suchen, wenn Sie möchten, dass sich die kaskadierenden Löschvorgänge in der tatsächlichen Datenbankstruktur widerspiegeln:
http://www.redhillonrails.org/foreign_key_migrations.html
Das Format für die Verwendung in einer Migration wäre ungefähr so:
quelle