2016-01-09 11 views
14

Ich habe 2 Tabellen:Ecto verwiesen löschen Datenbank-Datensatz

Benutzer:

id 
username 
password 

unique_index username 

(the schema has a has_many other) 

andere:

id 
user_id - references(:users) 
foo 

index user_id 

(the schema has a belongs_to user) 

im changeset für "Andere" Ich habe dieses

model 
|> cast(params, @req, @opt) 
|> foreign_key_constraint(:user_id) 

an dieser Stelle Meine Vermutung war das „Andere“ Ecto-Modell eines „User“ erfordert damit verbunden werden, um zu existieren (das ist, was ich will)

Aber meine zweite Annahme war, wenn ich die „User“ lösche dann werden alle verknüpften "Anderen" Datensätze gelöscht (über ein Cascade Löschen)

Was eigentlich passiert ist, dass ich einen Ecto.ConstraintError habe, wenn ich versuche einen "User" Datensatz zu löschen (ich nehme an, da ist ein " Anderer "Datensatz, der mit diesem Benutzer verbunden ist"

Also, wie würde ich gehen, damit es so funktioniert, wie ich will, was ist:

  • A „Benutzer“ kann standalone erstellt werden
  • Eine „andere“ erstellt werden kann, sondern auf einen „user“
  • Wenn eine „andere“ gestrichen beeinflussen es nichts anderes
  • angehören
  • Wenn ein „Benutzer“ gelöscht wird es löscht alle zugehörigen „andere“ Aufzeichnungen zu

Wesentliches für alle Elemente auf dem Benutzer ein Cascade löschen, die es

Antwort

34

Sie können es die Art und Weise tun angegeben Sie auf Ihrem Schema mit:

has_many :other, Project.Other, on_delete: :delete_all 

Allerdings können Sie wetten ter tun dies mit references/2 in der Migration:

create table(:others) do 
    add :user_id, references(:users, on_delete: :delete_all) 
end 

Diese Datenbank für Fremdschlüssel verwenden und in den has_many docs erwähnt wird:

: on_delete - Die auf Verbände Maßnahmen beim Muttermodell gelöscht . Kann sein: nichts (Standard),: nilify_all und: delete_all. Hinweis: on_delete kann auch in Migrationen festgelegt werden, wenn eine Referenz erstellt wird.Wenn unterstützt, über Migrationen auf der Datenbank angewiesen ist

bevorzugt

Sie können mit einem vorhandenen Index ändern:

drop_if_exists index(:others, [:user_id]) 
alter table(:others) do 
    modify :user_id, references(:users, type: :uuid, on_delete: :delete_all) 
end 
7

ich es herausgefunden, auf der ha verweisen s viele können Sie sieht eine on_delete Option passieren

so die has_many ähnliche

has_many :other, Project.Other, on_delete: :delete_all 

Docs sind ziemlich hilfreich: p

https://hexdocs.pm/ecto/Ecto.Schema.html#has_many/3

+0

Arbeiten auf many-to-many zu –