تمنع القضبان حذف الطفل ما لم يتم حذف الأصل أيضًا
-
26-12-2019 - |
سؤال
في Ruby on Rails 4، لنفترض أن أحد الوالدين لديه العديد من الأطفال.عند حذف الأصل، يجب أيضًا حذف العناصر التابعة.وفيما عدا ذلك لا يجوز شطب الطفل إلا إذا كان يتيماً.كيف يتم فعل ذلك؟
حاولت مع ما يلي
class Parent < ActiveRecord::Base
has_many :children, inverse_of: :parent, dependent: :destroy
end
class Child < ActiveRecord::Base
belongs_to :parent, inverse_of: :children
before_destroy :checks
private
def checks
not parent # true if orphan
end
end
ومع ذلك، مع التحقق before_destroy، لا يتم حذف أي شيء.هل هناك أي طريقة لإخبار هذه الطريقة إذا كان سبب الاستدعاء هو حذف الأصل؟
هل هذا شيء غريب أن أطلبه؟أعني منع حذف الأطفال.
المحلول
العمل من إجابة الكارب من القضبان:كيفية تعطيل رد الاتصال before_destroy عندما يتم تدميره بسبب تدمير الأصل (:dependent => :destroy), ، جرب هذا:
طفل:
belongs_to :parent
before_destroy :prevent_destroy
attr_accessor :destroyed_by_parent
...
private
def prevent_destroy
if !destroyed_by_parent
self.errors[:base] << "You may not delete this child."
return false
end
end
الأبوين:
has_many :children, :dependent => :destroy
before_destroy :set_destroyed_by_parent, prepend: true
...
private
def set_destroyed_by_parent
children.each{ |child| child.destroyed_by_parent = true }
end
كان علينا أن نفعل هذا لأننا نستخدم جنون العظمة، و dependent: delete_all
سيتم حذفها بشدة بدلاً من حذفها بشكل بسيط.يخبرني حدسي أن هناك طريقة أفضل للقيام بذلك، لكنها ليست واضحة، وهذا ينجز المهمة.
لا تنتمي إلى StackOverflow