2016-06-09 5 views
0

Ich habe gerade festgestellt, dass ich einige Probleme beim Löschen von übergeordneten Modellen haben.Schienen Fremdschlüssel-Setup mit AR und Postgres

Ich habe dieses Setup:

user.rb

has_many :conversations, foreign_key: "sender_id", dependent: :destroy 

conversation.rb

belongs_to :sender, class_name: "User", foreign_key: "sender_id" 
belongs_to :recipient, class_name: "User", foreign_key: "recipient_id" 

Schema (Postgres DB)

add_foreign_key "conversations", "users", column: "recipient_id" 
add_foreign_key "conversations", "users", column: "sender_id" 

Wie Sie sich vorstellen können, wenn user.destroy i s genannt, und es ist ein Gespräch, in dem der Benutzer der Empfänger ist, dann wird es PG::ForeignKeyViolation ERROR: update or delete on table conversations violates foreign key constraint...

Um dieses Problem zu lösen erhöht Ich plane folgendes zu tun:

user.rb

#this will solve the rails side of the problem 
has_many :received_conversations, class_name: "Conversation", foreign_key: "recipient_id", dependent: :destroy 

Schema (DB):

#this will solve the DB side of the problem 
add_foreign_key "conversations", "users", column: "recipient_id", on_delete: :cascade 
add_foreign_key "conversations", "users", column: "sender_id", on_delete: :cascade 

Ist dies der richtige Weg, um dieses Problem zu lösen?

+0

Überprüfen Sie diesen Beitrag zu referenziellen Integritäts- und Fremdschlüsseleinschränkungen für Rails. Es sieht so aus, als wärst du genau richtig. https://robots.thoughtbot.com/referential-integrity-with-foreign-keys – bkunzi01

+0

Danke bkunzi01! Ich habe noch eine Frage nach dem Lesen des Artikels. Würden Sie auch auf der Rails Seite "abhängig:: zerstören"? Der Artikel sagt, dass es gelöscht werden könnte, aber ich würde es lieber behalten. –

Antwort

1

Sie brauchen nicht foreign_key Beziehung in ganz zu schweigen:

has_many :conversations, foreign_key: "sender_id", dependent: :destroy 

wie Sie bereits pflegen diese Beziehung in belongs_to. Wenn Sie die oben genannte Fremdschlüsselbeziehung entfernen, wird dependent:: destroy die entsprechenden Konversationsdatensätze sowie den gelöschten Benutzerdatensatz löschen. Der Empfänger oder Absender

+0

SnehaT, Ich habe ein weiteres Modell (Benachrichtigungen), das die gleichen Einstellungen wie Konversationen hat, und da rufe ich 'user.notifications' auf, da ich sie auflisten möchte. In diesem Fall funktioniert meine Lösung? Und was ist mit Db-Seite? –

+0

Ja, es wird auch für das Benachrichtigungsmodell funktionieren. Wenn Sie einen Benutzer löschen, werden die entsprechenden Benachrichtigungen gelöscht. – SnehaT