it-swarm.com.de

Kann ich das Löschen von Cascade in Rails einrichten?

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 in Ruby und Rails), aber mein Unternehmen investiert ziemlich viel in das Thema, also versuche ich, es ein bisschen genauer kennenzulernen Detail.

Es war schwierig für mich, meine Denkweise dahingehend zu ändern, dass ich eine Anwendung aus dem "Modell" und nicht aus der Datenbank entwerfe. Daher versuche ich herauszufinden, wie all die Konstruktionsarbeiten, die ich klassisch in der Datenbank in der Datenbank ausgeführt habe, ausgeführt würden Rails Modell statt.

Die letzte Aufgabe, die ich mir gestellt habe, ist es, herauszufinden, wie ein Rails) - Datenbankmodell für kaskadierende Löschvorgänge konfiguriert wird. Gibt es eine einfache Möglichkeit, dies zu tun? Oder müsste ich gehen in die MySQL und dies einrichten?

77
matt_dev

sie können die abhängige Option auch auf delete_all setzen. : delete_all gibt eine einzelne SQL-Anweisung aus, um alle untergeordneten Datensätze zu löschen. Aus diesem Grund können Sie mit: delete_all eine bessere Leistung erzielen.

has_many :memberships, dependent: :delete_all
94
Mike Breen

Ja, das kannst du, wenn du eine Beziehung wie has_many verwendest, machst du das einfach

has_many :memberships, dependent: :destroy
64
danmayer

Entgegen der vorgegebenen Antwort empfehle ich dringend, dies auch auf Datenbankebene zu tun. Falls Sie andere 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:

has_many :memberships, dependent: :delete_all

Stellen Sie jedoch auch sicher, dass Sie ein foreign_key in einer Migration. Auf diese Weise löscht die Datenbank die Datensätze automatisch für Sie.

So machen Sie die Werte ungültig, wenn eine Mitgliedschaft gelöscht wird, vorausgesetzt, Sie haben ein Benutzermodell:

add_foreign_key :users, :memberships, on_delete: :nullify

Sie können auch alle Modelle löschen, wenn eine Mitgliedschaft gelöscht wird

add_foreign_key :users, :memberships, on_delete: :cascade
20
Hendrik

Denken Sie daran, dass delete_all keine Rückrufe (wie before_destroy und after_destroy) für die untergeordneten Datensätze ausführt.

10
Jarin Udom

Es sieht so aus, als ob dieses Plugin Ihnen das geben könnte, wonach Sie suchen, wenn die kaskadierenden Löschvorgänge in der tatsächlichen Datenbankstruktur widergespiegelt werden sollen:

http://www.redhillonrails.org/foreign_key_migrations.html

Das Format für die Verwendung in einer Migration würde etwa so aussehen:

create_table :orders do |t|
  t.column :customer_id, :integer, :on_delete => :set_null, :on_update => :cascade
  ...
end
6
Sean McMains