Jako przykład kołowej dependent: :destroy
numerze:Czy istnieje zależny od kodu Rails 4:: niszczyć obejście?
class User < ActiveRecord::Base
has_one: :staff, dependent: :destroy
end
class Staff < ActiveRecord::Base
belongs_to :user, dependent: :destroy
end
Jeśli zadzwonię user.destroy
, powiązany staff
powinny zostać zniszczone, jak również. Odwrotnie, wywołanie staff.destroy
powinno również zniszczyć powiązany z nim user
.
To działało świetnie w Railsach 3.x, ale zachowanie zmieniło się w Rails 4.0 (i kontynuuje w 4.1), tak że tworzy się pętla i ostatecznie pojawia się błąd, "poziom stosu zbyt głęboki". Jednym z oczywistych sposobów obejścia tego problemu jest utworzenie niestandardowego wywołania zwrotnego za pomocą before_destroy
lub after_destroy
w celu ręcznego zniszczenia powiązanych obiektów zamiast korzystania z mechanizmu dependent: :destroy
. Nawet sytuacja issue in GitHub opened for this miała kilka osób polecających to obejście.
Niestety, nie mogę nawet obejść tego problemu. To jest to, co mam:
class User < ActiveRecord::Base
has_one: :staff
after_destroy :destroy_staff
def destroy_staff
staff.destroy if staff and !staff.destroyed?
end
end
Powodem tego nie działa jest to, że zawsze zwraca false
staff.destroyed?
. Więc tworzy cykl.
czy zaimplementowałeś tę logikę do obu modeli, tak jak sugeruje Jken13579? – xlembouras
@xlembouras, nie próbowałem, ale jestem prawie pewien, że to nie zadziała. Spróbuję tego kiedyś w tym tygodniu, żeby się upewnić. Poniżej napisałem, dlaczego to nie zadziała. –
@at. jakiekolwiek szczęście z moją odpowiedzią? –