البرمجة

أساسيات Active Record في البرمجة

أساسيات Active Record: ماهيته، الاستيراد والنماذج

مقدمة

في عالم تطوير البرمجيات، تُعتبر بنية النماذج (Models) وأُطر العمل (Frameworks) التي تُعنى بإدارة البيانات أحد الأعمدة الأساسية في بناء التطبيقات الحديثة. ومن بين هذه البُنى، يبرز Active Record كنمط تصميم يُستخدم على نطاق واسع في أطر العمل مثل Ruby on Rails، لما يوفره من مرونة، وسهولة في التعامل مع قواعد البيانات، ودمج سلس بين البرمجيات والبيانات.

Active Record ليس مجرد مكتبة تتعامل مع قواعد البيانات، بل هو فلسفة متكاملة تعزز من الترابط بين الكائنات في الشيفرة البرمجية والجداول في قاعدة البيانات.

ما هو Active Record؟

Active Record هو نمط تصميم (Design Pattern) يُستخدم للربط بين الكائنات البرمجية (Objects) في لغة البرمجة والجداول في قاعدة البيانات.

يُتيح هذا النمط إمكانية تمثيل صفوف الجداول ككائنات (Objects)، وكل صف منها يُمثِّل كائناً فريداً يمكن التعامل معه بطريقة كائنية التوجه (Object-Oriented).

تم تطويره كجزء من بنية MVC (Model-View-Controller)، والتي تُستخدم لتنظيم الشيفرة في التطبيقات البرمجية، حيث يُشكّل Active Record الجزء الخاص بـ “النموذج” (Model).

يتكون Active Record من مجموعة من الطبقات البرمجية التي تتفاعل مع قاعدة البيانات بشكل مباشر، مما يُمكِّن المطورين من:

  • إنشاء جداول جديدة.

  • تنفيذ استعلامات SQL تلقائيًا دون كتابتها يدويًا.

  • تنفيذ عمليات CRUD (إنشاء، قراءة، تحديث، حذف) على الكائنات البرمجية المرتبطة بالجداول.

البنية الأساسية لنمط Active Record

البنية الأساسية لنمط Active Record تعتمد على مبدأ ربط كل صف في جدول قاعدة البيانات بكائن واحد في الكود البرمجي، وكل عمود في الجدول يقابله خاصية في هذا الكائن.

بالتالي، يمكن التعبير عن جدول “users” مثلًا، من خلال كائن يسمى “User”، حيث يكون لكل مستخدم (صف) كائن منفصل يحمل بياناته.

مكونات البنية الأساسية:

المكون التفسير
الكلاس الأساسي للنموذج يمثل اسم الجدول (مثل User يمثل جدول users)
الخصائص تمثل الأعمدة في الجدول مثل name, email, password
الدوال (Methods) تحتوي على منطق العمل، كعمليات التحقق، والربط، والاستعلامات
العلاقات تربط الجداول ببعضها كالعلاقة بين User و Post

خصائص Active Record

  1. ربط مباشر بين الكائنات والجداول

    يتم توليد الكائنات بشكل تلقائي من الجداول. فكل مرة يتم استدعاء كائن جديد، يقوم Active Record بجلب بياناته من قاعدة البيانات.

  2. دمج سهل بين منطق التطبيق وقاعدة البيانات

    يسمح Active Record بكتابة منطق التحقق من صحة البيانات، وإنشاء العلاقات، وتطبيق قواعد العمل في نفس الكلاس الخاص بالنموذج.

  3. تجريد واجهة قاعدة البيانات

    لا حاجة لكتابة SQL يدويًا في معظم الأوقات، فالأوامر تُكتب بصيغة برمجية بسيطة مثل .where، .find، .save، وهي تُترجم تلقائيًا إلى SQL.

  4. دعم العلاقات المعقدة

    يدعم Active Record أنواع متعددة من العلاقات، مثل:

    • One-to-One

    • One-to-Many

    • Many-to-Many

    • Polymorphic Associations

  5. التحقق من صحة البيانات (Validations)

    يُمكن فرض شروط على البيانات المدخلة من خلال الكود، قبل إدخالها إلى قاعدة البيانات، ما يُعزز من موثوقية النظام.

  6. التنقل عبر الكائنات (Object Navigation)

    يمكن بسهولة الانتقال من كائن لآخر عبر العلاقات مثل user.posts أو post.comments.

استيراد Active Record واستخدامه

في بيئة Ruby

في إطار Ruby on Rails، يتم تحميل Active Record تلقائيًا ضمن بيئة العمل، ولكن في التطبيقات الصغيرة أو خارج إطار Rails، يمكن استخدامه بشكل مستقل:

ruby
require 'active_record'

ثم يتم إعداد الاتصال بقاعدة البيانات:

ruby
ActiveRecord::Base.establish_connection( adapter: 'sqlite3', database: 'db/development.sqlite3' )

بعد ذلك يمكن إنشاء نموذج كالتالي:

ruby
class User < ActiveRecord::Base end

وبذلك يمكن استخدام الكائن User للتفاعل مع جدول users.

بناء النماذج في Active Record

النموذج في Active Record هو كائن Ruby يمثل صفًا من جدول معين، ويُستخدم لإنشاء، قراءة، تعديل، أو حذف بيانات هذا الصف.

تعريف نموذج أساسي

ruby
class Product < ActiveRecord::Base end

يفترض Active Record أن هناك جدولًا باسم products في قاعدة البيانات يحتوي على أعمدة تتوافق مع الخصائص المستخدمة في كلاس Product.

إضافة التحققات (Validations)

للتحقق من صحة البيانات:

ruby
class Product < ActiveRecord::Base validates :name, presence: true validates :price, numericality: true end

العلاقات (Associations)

Active Record يوفر دعمًا كاملاً لإنشاء العلاقات بين النماذج:

ruby
class Author < ActiveRecord::Base has_many :books end class Book < ActiveRecord::Base belongs_to :author end

التعامل مع البيانات

  • إنشاء سجل جديد:

ruby
user = User.new(name: "Ali", email: "[email protected]") user.save
  • قراءة بيانات:

ruby
User.all User.find(1) User.where(name: "Ali")
  • تحديث البيانات:

ruby
user = User.find(1) user.update(name: "Ahmed")
  • حذف البيانات:

ruby
user = User.find(1) user.destroy

آلية عمل Active Record

من الكود إلى قاعدة البيانات

عند تنفيذ أمر مثل:

ruby
User.where(age: 30)

يقوم Active Record بتحليل هذا الأمر وتحويله إلى استعلام SQL كالتالي:

sql
SELECT * FROM users WHERE age = 30;

ثم يُعيد النتائج في شكل مجموعة من الكائنات User.

من قاعدة البيانات إلى الكود

بالمقابل، عند تنفيذ:

ruby
user = User.find(1)

يتولى Active Record تنفيذ الاستعلام التالي:

sql
SELECT * FROM users WHERE id = 1;

ثم يُحَوّل السطر المسترجع إلى كائن برمجي يمكن التفاعل معه.

جدول يوضح أنواع العلاقات في Active Record

نوع العلاقة مثال التفسير
belongs_to Book belongs_to :author كل كتاب يرتبط بمؤلف واحد
has_one User has_one :profile كل مستخدم لديه ملف شخصي واحد
has_many Author has_many :books كل مؤلف لديه العديد من الكتب
has_many :through Doctor has_many :appointments through :patients علاقة متعددة من خلال جدول وسيط
has_and_belongs_to_many Student has_and_belongs_to_many :courses علاقة متبادلة مباشرة بين طرفين

التوسع في Active Record

يدعم Active Record عددًا من الميزات المتقدمة التي تجعل منه خيارًا مثاليًا لتطبيقات واسعة النطاق:

  • Callbacks (الردود البرمجية): مثل before_save, after_create، تُمكن من تنفيذ أوامر قبل أو بعد عمليات معينة.

  • Scopes: تعاريف جاهزة لاستعلامات شائعة تُستخدم كطرق داخل النموذج.

  • Migrations (الهجرات): تُستخدم لتحديث هيكل قاعدة البيانات تدريجيًا باستخدام كود برمجي قابل للتتبع.

  • Inheritance (الوراثة): مثل STI (Single Table Inheritance)، التي تُمكن من تخزين أنواع مختلفة من الكائنات في نفس الجدول.

  • Polymorphic Associations: علاقات متعددة الأشكال تسمح لكائن معين أن يرتبط بأكثر من نوع من النماذج.

الاستخدام خارج Ruby on Rails

على الرغم من ارتباط Active Record غالبًا بـ Ruby on Rails، إلا أنه يمكن استخدام المفاهيم المشابهة أو المكتبات المشابهة له في لغات أخرى:

  • JavaScript/Node.js: مكتبة Sequelize.

  • PHP: مكتبة Eloquent ضمن Laravel.

  • Python: مكتبة SQLAlchemy أو Django ORM.

  • Java: مكتبات مثل Hibernate.

كل هذه الحلول تُحاكي نمط Active Record أو تقدم نمط ORM مشابه يُوفر نفس المزايا من حيث الربط بين الكائنات وقواعد البيانات.

الخاتمة

يمثل Active Record أداة جوهرية في بيئات التطوير الحديثة، ويُشكل أحد المفاهيم الجوهرية في نمط تصميم MVC. يُسهّل هذا النمط من التصميم على المطورين التفاعل مع قواعد البيانات من خلال طبقة برمجية مبسطة، ويدعم مجموعة متقدمة من الميزات التي تلبي احتياجات تطبيقات صغيرة وكبيرة على حد سواء.

يُعد تعلم Active Record خطوة ضرورية لأي مطور يرغب في بناء تطبيقات متقدمة بإدارة فعالة للبيانات، ويُوفّر قاعدة متينة للانتقال نحو بنى أكثر تعقيدًا في البرمجة الحديثة.

المراجع