2016-04-27 10 views
2

Gib ein zwei Modelle, mit einem has_one Verein:has_one Beziehung automatisch Null, wenn mehr als ein

class ShopInfo 
    belongs_to :shop 
end 

class Shop 
    has_one :shop_info 
end 


s = Shop.create 
ss1 = s.create_shop_info 

In einem anderen Ort meines Codes ich

ss2 = s.create_shop_info 

Danach, SS1. shop_id wird auf null gesetzt, also ist ss1 jetzt ein verwaister Datensatz.

Gibt es eine Möglichkeit, vorherige Datensätze zu entfernen, anstatt sie auf Null zu setzen?

+0

Warum Sie die vorherige shop_info nicht aktualisieren aufnehmen, anstatt ein neues zu erstellen? – Joeyjoejoe

+0

Ich versuche zu verhindern, dass andere Entwickler verwaiste Datensätze erstellen, die diesen Aufruf ausführen. Ich könnte dies für eine isolierte Lösung, aber ich werde dieses Verhalten für andere Entwickler in zukünftigen Code nicht verhindern. –

Antwort

3

Standardmäßig führt die has_one Vereinigung ein nullify. Das Hinzufügen des dependent: :destroy löste das Problem.

class Shop 
    has_one :shop_info, dependent: :destroy 
end 

dir vor, wenn jemand mehr Infos möchte, ist der Active Code für has_one Ersatz Datensatz folgt aus:

https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/associations/has_one_association.rb#L24-L51

aber wenn Sie eine dependent Option im Verein hinzufügen, führt die delete Methode als auch :

https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/associations/has_one_association.rb#L7-L22

+0

Dies sollte als Antwort akzeptiert werden! Nicht bekannte abhängige Option funktioniert auf diese Weise. –

+0

weil es meine eigene Antwort ist, muss ich zwei Tage warten, um es zu akzeptieren :( –

1

Fran, wenn man sich the has_one documentation sehen, ich glaube, Sie association= Methode verwenden möchten:

Verband = (Associate)

Ordnet das assoziiertes Objekt, extrahiert die Primärschlüssel , legt es als Fremdschlüssel fest und speichert das zugehörige Objekt . Um Datenbankinkonsistenzen zu vermeiden, löscht ein vorhandenes zugehöriges Objekt bei der Zuweisung eines neuen dauerhaft, auch wenn das neue nicht in der Datenbank gespeichert wird.

Welche Code bedeutet aussehen könnte ...

ss2.shop_info = ShopInfo.new(...) 
+0

Danke für Ihren Vorschlag. Ich fand die Lösung wieder die Dokumentation lesen. Leider verhindert Ihre Lösung nicht, dass andere Entwickler das gleiche Problem beim Aufruf von create_shop_info haben. –