سؤال

ويا كل شيء، لدي شيء من متطلبات مثيرة للاهتمام لمشروعي. انا بحاجة الى علاقة has_one حيث هو إما فئة واحدة أو أخرى، ولكن من دون الميراث. أنا يمكن أن تفلت من الميراث إذا كان هذا هو السبيل الوحيد، ولكن اثنين من السجلات المنتسبين لديها بيانات مختلفة تماما ويست مرتبطة على الإطلاق.

ما أنا بحاجة لمعرفة شيء كما يلي.

# 1. Foo never belongs to anything.
# 2. Foo MUST have one assigned sub-record for validity.
# 3. Foo can only have either Bar or Baz assigned.
# 4. Bar and Baz have only ONE common property, and aren't
#    related in either data or implementation.

class Foo < ActiveRecord::Base
  # Attributes: id, name, value
  has_one :assignment, :foreign_key => 'assigned_to', :readonly => true
          # Could really use an :object_type for has_one here...
end

class Bar < ActiveRecord::Base
  # Attributes: name,...
end

class Baz < ActiveRecord::Base
  # Attributes: name,...
end

وأين Foo لديها مهمة واحدة، من نوع إما Bar أو Baz. إلا أنهما يشتركان فقط عمود واحد مشترك، لذلك ربما أستطيع أن تجعل الكائن الأصل من ذلك. ومع ذلك، إذا كنت جعلها ترث من كائن المشترك (عندما تكون البيانات التي تحتوي عليها حقا والبرتقال والتفاح) يجب أن أقوم بإجراء طاولة للسجل؟ يمكنني ربما تفلت من العقاب إذا كان السجل هو سجل مجردة، ولكن الأطفال ليسوا؟

وأفترض الآن يمكنك ان ترى صعوبة في بلدي. أنا جديدة إلى حد ما رور لكن تحبه حتى الآن. أنا متأكد من أن هناك وسيلة للتغلب على هذه، ولكن سأكون مرتق إذا لم أتمكن من معرفة ما هو عليه.

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

المحلول

وأنت تحاول نموذج شيء لا تناسب نموذج قواعد البيانات العلائقية. جميع الإشارات في SQL لها أصل واحد وهدف واحد.

وFWIW، الجمعيات تعدد الأشكال هو أيضا نموذج مضاد لأنه يكسر هذه القاعدة. وينبغي أن يكون لديه أدنى فكرة أنه من تصميم المكسور عند <م> توثيق يقول يجب التخلي عن لسلامة القيد المرجعي والعمل على انجاحه!

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

نصائح أخرى

ولعل طريقة واحدة للقيام بذلك، هو خلق لديه واحد والجمعيات في فو، لنقابة المحامين وباز. قم بإنشاء طريقة تسمى الاحالة والاحالة = التي يمكن أن تكون السبيل الوحيد للوصول إلى بار وباز. يمكنك التحقق من أي من has_ones اثنين لا شيء في طريقة الحصول على والعودة أن واحدا. في طريقة التعيين، يمكنك إنهاء إجراءات ما هو نوع المتغير الذي تم تمريره في وتعيين صحيح ديه علاقة واحد إلى هذا الكائن وتعيين البعض لاشيء. الذي يجب أن يشمل كل ما تبذلونه من القواعد دون أن تكون معقدة للغاية.

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