سؤال

هذا السؤال لديه بالفعل إجابة هنا:

أحاول أن أفهم 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.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top