2016-09-13 3 views
3

zerstören Ich habe eine einfache has_many Beziehung in einer Rails-4.2-Modell:Schienen Foreign Key Verletzung Löschen has_many Beziehungen mit abhängigen

class Owner < ActiveRecord::Base 
    has_many :nested_things, :inverse_of => :owner, :class_name => "Nested::Thing", :dependent => :destroy 
end 

class Nested::Thing < ActiveRecord::Base 
    belongs_to :owner, :inverse_of=>:nested_things 
end 

Die Modelle wesentlich komplizierter als diese sind, mit vielen anderen Beziehungen.

Wenn jemand versucht, eine Owner heute zu löschen, es scheiterte, weil es ein Fremdschlüssel auf der nested_things Tabelle ist:

> psql annoying_problem 

psql (9.5.3) 
Type "help" for help. 

annoying_problem=# \d+ nested_things 
                  Table "public.nested_things" 
     Column  |   Type    |       Modifiers       | Storage | Stats target | Description 
------------------+-----------------------------+----------------------------------------------------------------+----------+--------------+------------- 
id    | integer      | not null default nextval('nested_things_id_seq'::regclass)  | plain |    | 
owner_id   | integer      |                | plain |    | 

Indexes: 
    "nested_things_pkey" PRIMARY KEY, btree (id) 
    "ix_nested_things_on_owner_id" btree (owner_id) 
Foreign-key constraints: 
    "nested_things_owner_id_fk" FOREIGN KEY (owner_id) REFERENCES owners(id) 

Wenn die owner gelöscht, es ist ein zeitaufwendiger Prozess - lokal diese bestimmten Datensatz generierte eine 109.000 Zeilen Logdatei aller ausgeführten SQL. die Nested_things-Beziehung führt jedoch dazu, dass der gesamte Vorgang abgebrochen wird, da eine Überprüfung des Fremdschlüssels fehlschlägt.

Hier ist, was der relevante Teil der Protokolldatei zu sein scheint:

> grep -n nested_things delete-owner.txt 

.... 

109762: SQL (1.1ms) DELETE FROM "nested_things" WHERE "nested_things"."id" = $1 [["id", 8665]] 

109836: ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: 
     ERROR: update or delete on table "owners" violates foreign key 
     constraint "nested_things_owner_id_fk" on table "nested_things" 

109837: DETAIL: Key (id)=(6343) is still referenced from table "nested_things". 

Es gibt nur eine nested_things Eintrag für diesen Besitzer. Was kann eine: dependent =>: zerstören Beziehung in Rails, um die abhängige Beziehung zu löschen, aber die Fremdschlüsselprüfung fehlschlagen?

+0

Ich dachte, vielleicht der Index war beschädigt, aber wieder Indizierung nichts ändern. –

+0

Dies ist nicht der erste Fremdschlüssel, der überprüft wird, wenn ich versuche, direkt aus der Tabelle zu löschen. –

+0

Löschen eines anderen Besitzer Datensatz, der auch geschachtelte_things funktioniert gut. –

Antwort

0

Stellt sich heraus, die Antwort ist ein Standardbereich auf den has_many Beziehungen war, die nicht berücksichtigt wurden in der zerstören.

+0

Wie hast du es beseitigt? Entweder hast du default_scope entfernt oder auf andere Weise gelöst? –

+0

Es sieht so aus, als ob ich dem Modell, in dem die Verletzung des Fremdschlüssel aufgetreten ist, ein Objekt before_destroy hinzugefügt habe, das die Objekte gelöscht hat, die nicht im Standardbereich enthalten sind. Der Standardbereich war 'enabled: true', so dass mein before_destroy alles mit aktiviertem false oder aktiviertem Nil löschte: ' '' before_destroy { NestedThings.unscoped.where (: owner_id => self.id,: enabled => [nil , falsch]). destroy_all } '' ' –