سؤال

من خلال العديد من إجراءات الاختبار، لاحظت فقط أن جدول الانضمام الذي يمثل علاقة Habtm بين نماذج لا يزيل الإدخالات عند حذف مثيلات هذه النماذج. هل أحتاج إلى القيام بشيء خاص عند إزالة مثيل نموذج له علاقات Habtm؟

هل كانت مفيدة؟

المحلول

عند إجراء تفتيش أوثق، يجب أن تؤدي علاقات Habtm إلى إزالة إدخالات جدول الانضمام. ومع ذلك، فإن أي علاقات Habtm أو العلاقة التي وصفتها في الإصدار الأصلي (انظر تاريخ المشاركة) من هذا الحل ستزيل إدخالات جدول الانضمام عند القضاء على السجل مع delete طريقة. ActiveRecord::Base#delete لا يؤدي إلى تشغيل أي عمليات اسجوين، مثل تلك العلاقة Habtm تنشئ لإزالة إدخالات الأيتام من جدول الانضمام. بدلا من ذلك يجب أن تستخدم ActiveRecord::Base#destroy.

سيتعين عليك استخدام SQL RAW لإزالة الإدخالات غير الضرورية. إذا قررت إنشاء نموذج انضمام، فيمكنك التكرار من خلال الإدخالات في نموذج الانضمام، وحذف أولئك بدون جمعية.

مثال:

class Foo < ActiveRecord::Base
  has_many :foo_bars, :dependent => :destroy
  has_many :bars, :through => :foo_bars
end

class FooBar < ActiveRecord::Base
  belongs_to :foo
  belongs_to :bar
end

class Bar < ActiveRecord::Base
  has_many :foo_bars, :dependent => :destroy
  has_many :foos, :through => :foo_bars
end

FooBar.all.each{|fb| fb.destroy? if fb.foo.nil? || fb.bar.nil? }

نصائح أخرى

يجب حذف الإدخالات في جدول الانضمام دون القيام بأي شيء خاص. يمكنك إضافة :delete_sql خيار التعليمات البرمجية الخاصة بك لتغيير السلوك إذا كان لديك موقف غريب. حذف الكائن الموجود على الجانب الآخر من الانضمام ليس سلوكا افتراضيا.

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