HAS_ONE: من خلال نموذج الانضمام
-
22-09-2019 - |
سؤال
أرغب في إنشاء شيء ما حتى يتمكن الشخص من الحصول على العديد من عناوين البريد الإلكتروني وعنوان بريد إلكتروني يحتوي على شخص واحد فقط ، ولكن لأن لدي أيضًا نموذج آخر يسمى شركة يمكن أن يكون لديها أيضًا العديد من عناوين البريد الإلكتروني ، ولا أريد أن يكون لدي أعمدة Company_ID و person_id في جدول رسائل البريد الإلكتروني ، لذلك اعتقدت أنه يمكنني فعل ...
شخص
has_many: person_emails has_many: رسائل البريد الإلكتروني ،: من خلال =>: person_emails
person_emails.rb
ينتمي إلى: شخص ينتمي إلى: البريد الإلكتروني
البريد الإلكتروني
has_one: person_email has_one: الشخص ،: من خلال =>: person_email
ما يحدث الآن هو ...
p = person.first #=> "nik" p.emails #=> يعرض جميع رسائل البريد الإلكتروني nik has p.person_emails #=> يعرض جميع سجلات جدول المشترك بين الشخص
e = email.
أود ... E.Person #=> "نيك"
هل لدى أي شخص فكرة عما قد تكون عليه المشكلة؟
شكرا
المحلول
يقترح وضعك استخدام ارتباطات متعددة الأشكال ، والتي هي أكثر نظافة من has_many :through
ذات الصلة. علي سبيل المثال:
class Person
has_many :emails, :as => :emailable
end
class Company
has_many :emails, :as => :emailable
end
class Email
belongs_to :emailable, :polymorphic => true
end
يمكنك التخلص من PersonEmails
الطبقة تماما. في قاعدة البيانات ، الخاص بك emails
سيبدو الجدول شيئًا كهذا:
create_table :emails do |t|
t.string :address
t.string :emailable_type
t.integer :emailable_id
end
ال emailable_type
يخزن العمود اسم النموذج المرتبط به في حالتك "Person"
أو "Company"
, ، و ال emailable_id
يخزن معرف الكائن المرتبط. لمزيد من المعلومات، راجع وثائق API Rails تحت "الجمعيات متعددة الأشكال".