2016-05-04 3 views
2

Ich möchte etwas aus meiner Datenbank löschen. Der Wert verweist auf einige andere Tabellen.Schienen können eine übergeordnete Zeile nicht löschen oder aktualisieren: eine Fremdschlüsseleinschränkung schlägt fehl

Fehler ist:

Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails 

Wie kann ich das richtig lösen?

Wenn ich einige Einschränkungen wie bei der Löschkaskade hinzufügen, werden die anderen Werte nicht gelöscht, oder?

Edit:

def delete 
    @vid = Movie.find params[:id] 
    @vid.delete 
    redirect_to :action => :add 
end 

Update-Modelle

movie.rb

class Movie < ActiveRecord::Base 
    has_many :comments, :dependent => :destroy 
    has_many :ratings 
    belongs_to :channel 
    has_and_belongs_to_many :tags 
    has_and_belongs_to_many :categories 
    mount_uploader :video, MovieUploader 

comment.rb

class Comment < ActiveRecord::Base 
    belongs_to :movie 
    belongs_to :user 
    belongs_to :rating 

Antwort

2

Wenn Sie die Fremdschlüssel erstellt haben mit ActiveRecord::Migration, wird es ON DELETE RESTRICT standardmäßig verwenden (das heißt, wird Eltern-Eintrag nicht gelöscht werden, wenn es Einträge in Referenzen Tabellen).

Sie benötigen eine Migration ändern ON DELETE CASCADE zu verwenden:

class CreateChild < ActiveRecord::Migration 
    def change 
    create_table :child do |t| 
     t.references :parent, foreign_key: {on_delete: :cascade} 
    end 
    end 
end 
1

Könnten Sie die entsprechende Datenbankschema erstellen?

Wenn Sie eine Löschkaskade-Einschränkung einrichten, werden die anderen Werte gelöscht. Wenn dies nicht das gewünschte Ergebnis ist, müssen Sie möglicherweise die referenzielle Integrität der Datenbank überdenken.

Vielleicht möchten Sie stattdessen den ActsAsParanoid-Edelstein verwenden, um stattdessen die Elemente weich zu löschen?

+0

Fehler aus einer Kommentar kommen, die zu einem Film gehört. Mysql2 :: Fehler: Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: eine Fremdschlüsseleinschränkung schlägt fehl ('dev'.comments', CONSTRAINT' fk_rails_56963e5c80' FOREIGN KEY ('movie_id') REFERENZEN' filme' ('id')) : DELETE FROM 'filme' WHERE' filme'.id' = 1 Die Kommentare könnten gelöscht werden .. also sollte ich nur die on delete cascade richtig hinzufügen? – Felix

+1

Wenn Sie die Kommentare löschen möchten, wenn Sie den Film löschen, dann ja. Du könntest das Modell so aussehen 'class Movie glapworth

+1

versuchte dies, aber depent:: destroy hat keinen Effekt .. – Felix

1

Stellen Sie sicher, Ihre Eltern Model.rb

hat
has_many :model, :dependent => :delete_all 

dies sicher wird gelöscht alle Ihre Daten macht, wenn Sie ein übergeordnetes Modell löschen.

Wie zum Beispiel Sie haben Post.rb und Comment.rb

Post.rb

has_many :Comments, :dependent => :delete_all 

Also, wenn Sie einen Beitrag löschen, alle entsprechenden Kommentare und gelöscht werden.

Hoffe, dass es

Prost

+0

Danke, aber es nicht irgendein Effekt. Fehler erscheint immer noch – Felix

+0

keine weiteren Hinweise? es funktioniert nicht. – Felix

+0

Wie löschen Sie es? – Boltz0r

2

Sie verwenden delete, von the documentation geholfen:

To enforce the object's before_destroy and after_destroy callbacks or any :dependent association options, use #destroy.

So müssen Sie destroy stattdessen verwenden, so dass die richtige Rückruf von Schienen abhängig Aufzeichnungen entfernen ausgeführt:

def delete 
    @vid = Movie.find params[:id] 
    @vid.destroy 
    redirect_to :action => :add 
end 

Da Ihre Comment Datensätze von dem Movie Datensatz abhängen, den Sie löschen möchten, da rails nur versucht, den Film vor den Kommentaren zu entfernen, beschwert sich das Datenbankmodul, wenn ein Fremdschlüssel von der Kommentartabelle zur Filmtabelle vorhanden ist.

Verwandte Themen