Als Beispiel für die kreisförmige dependent: :destroy
Ausgabe:Ist ein Circular Rails 4 abhängig:: Workaround zu zerstören?
class User < ActiveRecord::Base
has_one: :staff, dependent: :destroy
end
class Staff < ActiveRecord::Base
belongs_to :user, dependent: :destroy
end
Wenn ich user.destroy
nennen, sollte die zugehörige staff
auch zerstört werden. Umgekehrt sollte das Aufrufen von staff.destroy
das zugehörige user
ebenfalls zerstören.
Dies funktionierte hervorragend in Rails 3.x, aber das Verhalten in Rails 4.0 geändert (und weiter in 4.1), so dass eine Schleife bildet und schließlich erhalten Sie einen Fehler, "Stack-Level zu tief." Eine offensichtliche Problemumgehung besteht darin, einen benutzerdefinierten Rückruf zu erstellen, der before_destroy
oder after_destroy
verwendet, um die zugeordneten Objekte manuell zu zerstören, statt den dependent: :destroy
-Mechanismus zu verwenden. Selbst in der issue in GitHub opened for this Situation hatten einige Leute diese Problemumgehung empfohlen.
Leider kann ich diese Problemumgehung nicht einmal zur Arbeit bekommen. Das ist, was ich habe:
class User < ActiveRecord::Base
has_one: :staff
after_destroy :destroy_staff
def destroy_staff
staff.destroy if staff and !staff.destroyed?
end
end
Der Grund, warum dies nicht der Fall funktioniert, dass staff.destroyed?
false
immer wieder. Es bildet also einen Kreislauf.
haben Sie diese Logik für beide Modelle implementiert, wie Jken13579 vorschlägt? – xlembouras
@xlembouras, habe es nicht versucht, aber ich bin mir ziemlich sicher, es wird nicht funktionieren. Ich werde es irgendwann diese Woche versuchen, nur um sicher zu gehen. Ich habe unten geschrieben, warum es nicht funktioniert. –
@at. Hast du Glück mit meiner Antwort? –