مدخل إلى Activerecord: العلاقات

قاعدة بيانات علائقية بدون تبادل مرجعي (cross-referencing) بين الجداول لا يعني الشيء الكثير. في مثال الجزء الأول المقال داخل المدونة (Post) يمكن أن يحوي على أكثر من تعليق أو لا يحوي أي تعليق. التعليق و الذي سيُمثل بجدول في قاعدة البيانات يحتوي على عمود (post_id) يُمكن من خلاله ربط التعليق بالمقال. الActiverecord يرعى هذه العلاقات بالنسبة لنا ويجعلها شفافة لحد كبير و لدرجة أننا لن نحتاج إلى لمس الSQL. هناك مجموعة من العلاقات يستطيع الActiverecord إدارتها من بينها :

belongs_to :

تعتبر العلاقة الأكثر إستعمالا في قاعدة البيانات. قولنا بأن النوع أ ينتمي إلى النوع ب هذا يعني أن النوع أ يحتوي على عمود ID مرجعي للنوع ب. مثال ذلك، أنه داخل المدونة الPost يحتوي على أكثر من تعليق (Comments) أي بمعنى أخر أن التعليق ينتمي لPost واحد فهذا يعني أن الجدول الذي يمثل الComment سوف يحتوي على العمود Post_Id والذي يُشير إلى الPost الذي يحوي التعليق. النتيجة أنه إذا كان لك كائن يُمثل تعليقا من التعليقات (c) فإنه بإمكاننا إستخراج الPost الموافق عن طريق الأمر : c.Post و النتيجة أيضا أن حذف الPost يعني مباشرة حذف التعليقات التي تنتمي إليه.

has_many :

تُعبر العلاقة عن الطرف الأخر للعلاقة belongs_to. في المثال السابق كان بإمكاننا القول : التعليق ينتمي إلى مقال (belongs_to) أو المقال له مجموعة من التعليقات (has_many). المقال لا يحتفظ بجدول يحتوي على التعليقات التي تنتمي إليه، ولكن بكل بساطة يستعلم داخل جدول التعليقات و يستخرج تلك التي تتعلق به. فمثلا من أجل المقال p التعليقات الخاصة به ستُحفظ داخل جدول عن طريق الأمر : p.comments.

has_one :

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

has_many :through Association :

تستعمل هذه العلاقة لإعداد العلاقة مجموعة إلى مجموعة (many to many) بواسطة نموذج وسط. العلاقة تشير إلى أن النموذج المعلن يمكن ربطه مع صفر أو أكثر من حالة لنموذج ثاني بواسطة نموذج ثالث وسط. لنفرض مثلا أننا نريد معرفة ثمن الحليب الذي يبيعه المربي لبائعي التجزئة. الأمر كان سهلا لو كان الثمن ثابت بحيث أنه كان بإمكاننا جعل ثمن الحليب عبارة عن عمود داخل الجدول الخاص بالمربي فقط ولكن هذا غير صحيح لأن الثمن غير ثابت و يختلف باختلاف بائعي التجزئة أو لأن البائع يشتري الحليب بأثمان مختلفة باختلاف المربين، في هذه الحالة يمكننا استعمال العلاقة has_many :through ، لأنه يجب تعريف نموذج وسط بين البائع و المربي يعبر عن عملية التوزيع DISTRIBUTION.

1
2
3
4
5
6
7
8
9
10
11
12
class Reseller < ActiveRecord::Base
  has_many :distributions
  has_many :farmers, :through => :distributions
end
class Distributions < ActiveRecord::Base    
  belongs_to :reseller
  belongs_to :farmer
end
class Farmer < ActiveRecord::Base
  has_many :distributions
  has_many :resellers, :through => :distributions
end

has_and_belong_to_many :

هذه العلاقة تُعتبر مُعقدة نوع ما. المثال التقليدي هو “الوسمات”. بمعنى أن المقال له مجموعة من الوسمات و الوسام يمكن أن ينتمي إلى مجموعة مقالات مختلفة، أي أن العلاقة هي has_many بين الوسام و المقال بدون نموذج وسط.

التعليقات