الفرق بين has_one و owns_to في ريلز؟[ينسخ]
-
21-08-2019 - |
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
- ما الفرق بين ينتمي إلى و has_one؟ 4 إجابات
أحاول أن أفهم has_one
العلاقة في RoR
لنفترض أن لدي نموذجين - Person
و Cell
:
class Person < ActiveRecord::Base
has_one :cell
end
class Cell < ActiveRecord::Base
belongs_to :person
end
هل يمكنني فقط استخدام has_one :person
بدلاً من belongs_to :person
في Cell
نموذج؟
أليس هو نفسه؟
المحلول
لا، فهي غير قابلة للتبديل، وهناك بعض الاختلافات الحقيقية.
belongs_to
يعني أن المفتاح الخارجي موجود في الجدول لهذه الفئة.لذا belongs_to
يمكن الذهاب فقط إلى الفصل الذي يحمل المفتاح الخارجي.
has_one
يعني أن هناك مفتاح خارجي في جدول آخر يشير إلى هذه الفئة.لذا has_one
يمكن فقط الانتقال إلى الفصل المشار إليه بواسطة عمود في جدول آخر.
لذلك هذا خطأ:
class Person < ActiveRecord::Base
has_one :cell # the cell table has a person_id
end
class Cell < ActiveRecord::Base
has_one :person # the person table has a cell_id
end
وهذا خطأ أيضاً:
class Person < ActiveRecord::Base
belongs_to :cell # the person table has a cell_id
end
class Cell < ActiveRecord::Base
belongs_to :person # the cell table has a person_id
end
الطريقة الصحيحة هي (إذا Cell
يتضمن person_id
مجال):
class Person < ActiveRecord::Base
has_one :cell # the person table does not have 'joining' info
end
class Cell < ActiveRecord::Base
belongs_to :person # the cell table has a person_id
end
بالنسبة للارتباط ثنائي الاتجاه، تحتاج إلى واحد من كل منهما، ويجب عليهم الانضمام إلى الفصل الصحيح.حتى بالنسبة للارتباط أحادي الاتجاه، من المهم أي نوع تستخدمه.
نصائح أخرى
إذا أضفت "belongs_to" فستحصل على ارتباط ثنائي الاتجاه.هذا يعني أنه يمكنك الحصول على شخص من الخلية وخلية من الشخص.
لا يوجد فرق حقيقي، فكلا الطريقتين (مع وبدون "belongs_to") يستخدمان نفس مخطط قاعدة البيانات (حقل person_id في جدول قاعدة بيانات الخلايا).
كي تختصر:لا تضف "belongs_to" إلا إذا كنت بحاجة إلى ارتباطات ثنائية الاتجاه بين النماذج.
يتيح لك استخدام كليهما الحصول على معلومات من نموذجي الشخص والخلية.
@cell.person.whatever_info and @person.cell.whatever_info.