In Rails, Wie ermittelt man, ob ein Datensatz von einem abhängigen zerstört wurde:: Rückruf löschen?

8

Ich habe einen Datensatz in meiner Rails-App mit einem after_destroy -Hook, der darauf achten muss, warum der Datensatz zerstört wird. Genauer gesagt, wenn der Datensatz in einer Kaskade zerstört wird, weil sein Elternteil dependent: :destroy sagt, muss er die Dinge anders machen, als wenn der Datensatz einzeln zerstört würde.

Was ich versucht habe, ist zu sehen, ob sein Elternteil destroyed? ist, nur um herauszufinden, dass dependent: :destroy -Rückrufe durchgeführt werden, bevor der Elternteil zerstört wird. Das macht Sinn, weil es scheitern kann. (d. h. einschränken).

Also, wie mache ich das?

    
Pelle ten Cate 05.02.2014, 13:32
quelle

2 Antworten

4

Lösung # 1

Wenn Ihr Modell einfach genug ist und Sie keine Callbacks in der Child-Relation aufrufen müssen, können Sie einfach dependent: delete_all im Parent verwenden.

Lösung # 2

Für komplexere Szenarien können Sie destroyed_by_association verwenden, das ein Objekt ActiveRecord::Reflection::HasManyReflection zurückgibt, wenn es Teil einer Kaskade ist, oder sonst:

%Vor%

Ich habe es gerade in Rails 4.2 versucht und es funktioniert.

Quelle: Ссылка

    
alf 06.09.2016 19:14
quelle
3

Eine Möglichkeit, dies zu tun, ist die Verwendung des before_destroy -Rückrufs im übergeordneten Objekt, um alle untergeordneten Objekte als durch Eliminierung zerstört zu kennzeichnen. Wie sein:

%Vor%

Sie können ActiveRecord Reflections auch verwenden, um automatisch zu bestimmen, welche Verknüpfungen als :dependent => :destroy markiert sind. Dies ist hilfreich, wenn Sie diese Funktion in vielen Klassen benötigen.

    
davidb 05.02.2014 13:46
quelle