سؤال

في 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 سيتم حذفها بشدة بدلاً من حذفها بشكل بسيط.يخبرني حدسي أن هناك طريقة أفضل للقيام بذلك، لكنها ليست واضحة، وهذا ينجز المهمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top