البرمجة

كيفية التعامل مع النماذج في Rails

النماذج (Models) في Rails: إنشاؤها والتعامل معها وحفظ البيانات في قواعد البيانات

تُعدُّ نماذج (Models) في إطار العمل روبي أون ريلز (Ruby on Rails) العمود الفقري لبناء تطبيقات ويب قوية ومرنة. فهي الوسيلة الأساسية التي تتفاعل من خلالها التطبيقات مع قواعد البيانات، حيث تُستخدم لتمثيل البيانات وتعريف قواعد العمل الخاصة بها، بالإضافة إلى تنفيذ العمليات المتعلقة بالبيانات مثل الإنشاء، القراءة، التحديث، والحذف (CRUD). في هذا المقال، سيتم تناول شرح مفصل حول النماذج في Rails، كيفية إنشاؤها، التعامل معها، وآليات حفظ البيانات في قواعد البيانات مع استعراض معمق لكيفية عملها، وأفضل الممارسات التي يجب اتباعها عند استخدامها.


مفهوم النماذج (Models) في Rails

النموذج في Rails هو مكون برمجي يمثل كيانًا معينًا من العالم الحقيقي في التطبيق، مثل المستخدم (User)، المقال (Article)، المنتج (Product)، وغيرها من الكيانات. يتم ربط كل نموذج بجدول معين في قاعدة البيانات، بحيث يعكس النموذج السجلات في هذا الجدول.

تتمثل أهمية النماذج في كونها الجزء المسؤول عن:

  • تمثيل البيانات: كل نموذج يمثل جدولًا في قاعدة البيانات، وكل كائن (Object) من هذا النموذج يمثل صفًا (record) في الجدول.

  • تحديد قواعد العمل: يمكن تضمين منطق العمل في النماذج، مثل التحقق من صحة البيانات (validations)، وكتابة قواعد خاصة لحفظ أو تعديل البيانات.

  • التعامل مع قاعدة البيانات: من خلال النماذج يتم تنفيذ عمليات CRUD بطريقة سلسة وبسيطة دون الحاجة لكتابة استعلامات SQL بشكل يدوي.

  • العلاقات بين البيانات: النماذج تعبر عن العلاقات بين الجداول المختلفة، مثل علاقات “واحد إلى كثير” أو “كثير إلى كثير”.


طريقة إنشاء النماذج في Rails

في Rails، يتم إنشاء النماذج باستخدام الأمر rails generate model الذي يقوم بإنشاء ملفات النموذج، بالإضافة إلى إنشاء ملف الهجرة (migration) لإنشاء جدول قاعدة البيانات المناسب.

مثال على إنشاء نموذج للمقالات (Article):

bash
rails generate model Article title:string content:text published_at:datetime

هذا الأمر ينتج:

  • ملف النموذج app/models/article.rb

  • ملف الهجرة في مجلد db/migrate لتعريف بنية الجدول

بعد الإنشاء، يجب تنفيذ الهجرة لتحديث قاعدة البيانات:

bash
rails db:migrate

تُنشئ الهجرة جدولًا باسم articles يحتوي على الأعمدة title من نوع نص قصير (string)، content من نوع نص طويل (text)، وpublished_at لتخزين تاريخ ووقت النشر.


بنية ملف النموذج

بعد الإنشاء، يحتوي ملف النموذج على تعريف بسيط للنموذج:

ruby
class Article < ApplicationRecord end

يُعد هذا التعريف كافيًا في الكثير من الحالات لأن ApplicationRecord يرث من ActiveRecord::Base، وهي المكتبة المسؤولة عن ربط النماذج بقاعدة البيانات.


التعامل مع النماذج: العمليات الأساسية

1. إنشاء سجل جديد

لإنشاء سجل جديد في الجدول، يمكن استخدام إحدى الطريقتين:

  • إنشاء كائن وحفظه لاحقًا:

ruby
article = Article.new(title: "عنوان المقال", content: "محتوى المقال") article.published_at = Time.now article.save
  • إنشاء وحفظ الكائن مباشرة:

ruby
Article.create(title: "عنوان المقال", content: "محتوى المقال", published_at: Time.now)

2. قراءة البيانات

يمكن استرجاع السجلات بطرق متعددة:

  • جميع المقالات:

ruby
Article.all
  • العثور على سجل باستخدام المفتاح الأساسي (ID):

ruby
Article.find(1)
  • البحث باستخدام شروط:

ruby
Article.where(published_at: nil) Article.where("title LIKE ?", "%روبي%")

3. تحديث السجلات

يمكن تحديث سجل موجود بطريقتين:

  • تعديل الكائن ثم حفظه:

ruby
article = Article.find(1) article.title = "عنوان جديد" article.save
  • تحديث مباشر:

ruby
Article.update(1, title: "عنوان جديد")

4. حذف السجلات

لحذف سجل:

ruby
article = Article.find(1) article.destroy

أو حذف مجموعة:

ruby
Article.where("published_at < ?", 1.year.ago).destroy_all

التحقق من صحة البيانات (Validations) في النماذج

تُستخدم التحققات لضمان سلامة البيانات قبل حفظها في قاعدة البيانات. يمكن وضع قواعد تحقق في نموذج Article على سبيل المثال:

ruby
class Article < ApplicationRecord validates :title, presence: true, length: { minimum: 5, maximum: 100 } validates :content, presence: true validates :published_at, presence: true end

بهذه الطريقة، يمنع Rails حفظ المقالات التي لا تحتوي على عنوان أو محتوى، أو التي لا تلتزم بطول معين للعنوان.


العلاقات بين النماذج (Associations)

تُستخدم العلاقات لتعريف ارتباط النماذج ببعضها، مثل:

  • علاقة “واحد إلى كثير” (One-to-Many):

مثال: المستخدم يمكن أن يكون لديه عدة مقالات.

ruby
class User < ApplicationRecord has_many :articles end class Article < ApplicationRecord belongs_to :user end
  • علاقة “كثير إلى كثير” (Many-to-Many):

مثال: المقال يمكن أن يكون له عدة تصنيفات، والتصنيف يمكن أن يكون مرتبطًا بعدة مقالات.

ruby
class Article < ApplicationRecord has_and_belongs_to_many :categories end class Category < ApplicationRecord has_and_belongs_to_many :articles end

تسمح هذه العلاقات بالوصول السهل للبيانات المرتبطة دون الحاجة لاستعلامات معقدة.


الحفظ في قواعد البيانات: ActiveRecord وكيفية عمله

يعتبر ActiveRecord القلب النابض لـ Rails في التعامل مع قواعد البيانات، فهو عبارة عن مكتبة ORM (Object-Relational Mapping) تتيح تحويل البيانات بين النماذج والكائنات في التطبيق، وبين الجداول والسجلات في قاعدة البيانات.

مميزات ActiveRecord

  • تجريد الاستعلامات: يمكنك التعامل مع البيانات باستخدام كائنات Ruby بدلاً من كتابة استعلامات SQL.

  • الإجراءات التلقائية: يقوم ActiveRecord تلقائيًا بمعالجة عمليات الإدخال والتحديث والحذف.

  • إدارة العلاقات: يتيح ActiveRecord التعامل السلس مع العلاقات بين الجداول.

  • التحقق من صحة البيانات: يدعم التحقق من البيانات قبل عمليات الحفظ.

  • الهجرات: يسمح بتعديل بنية قاعدة البيانات بشكل منهجي ومنظم.


الهجرات (Migrations) وكيفية التحكم في بنية قواعد البيانات

تُستخدم الهجرات لإدارة تغييرات بنية قاعدة البيانات بشكل يسهل تتبعه وتطبيقه عبر بيئات التطوير والإنتاج. تُكتب الهجرات بلغة روبي وتحتوي على تعليمات لإنشاء أو تعديل الجداول والأعمدة.

مثال على ملف هجرة لإنشاء جدول المقالات:

ruby
class CreateArticles < ActiveRecord::Migration[6.1] def change create_table :articles do |t| t.string :title t.text :content t.datetime :published_at t.timestamps end end end
  • t.timestamps تضيف عمودين created_at وupdated_at تلقائيًا.

  • يمكن إضافة أعمدة أخرى، وتغيير نوعها، أو حذفها في هجرات لاحقة.


أمثلة متقدمة في النماذج

استخدام callbacks (ردود الفعل)

تتيح ردود الفعل تنفيذ أكواد تلقائيًا في أوقات محددة مثل قبل الحفظ أو بعد الحذف.

مثال:

ruby
class Article < ApplicationRecord before_save :set_default_published_at private def set_default_published_at self.published_at ||= Time.now end end

في هذا المثال، يتم تعيين تاريخ النشر إلى الوقت الحالي إذا لم يكن محددًا عند حفظ المقال.


إضافة نطاقات (Scopes)

تُستخدم لتسهيل استرجاع البيانات بطريقة مخصصة ومنظمة.

مثال:

ruby
class Article < ApplicationRecord scope :published, -> { where.not(published_at: nil) } scope :recent, -> { order(published_at: :desc) } end

يمكن بعدها استدعاء:

ruby
Article.published.recent

للحصول على المقالات المنشورة مؤخرًا.


التعامل مع الحقول المحسوبة

يمكن في النماذج تعريف وظائف تحسب قيمًا معينة بدلًا من تخزينها في قاعدة البيانات.

مثال:

ruby
class Article < ApplicationRecord def summary content.truncate(100) end end

هذه الدالة تعطي ملخصًا مقتضبًا من محتوى المقال.


الأداء والأمان في التعامل مع النماذج وقواعد البيانات

تحسين الأداء

  • التحميل المسبق (Eager Loading): لتقليل عدد الاستعلامات عند التعامل مع العلاقات.

ruby
Article.includes(:user).all
  • الفهارس (Indexes): إضافة فهارس على الأعمدة المستخدمة في عمليات البحث والتصفية لتحسين سرعة الاستعلام.

الحماية من هجمات SQL Injection

ActiveRecord يمنع حقن SQL تلقائيًا عند استخدام الطرق المدمجة مثل where مع المعاملات، مما يجعل التعامل أكثر أمانًا.


جدول يوضح أنواع البيانات الشائعة في الهجرات واستخداماتها

نوع البيانات (Data Type) الوصف الاستخدام الشائع
string نص قصير (حتى 255 حرف) العناوين، الأسماء، الحقول القصيرة
text نص طويل محتوى المقال، الوصف الطويل
integer أعداد صحيحة العدادات، المعرّفات
float أعداد عشرية القيم الرقمية ذات الفواصل العشرية
decimal أعداد عشرية بدقة عالية الأسعار، القيم المالية
boolean قيمة منطقية (صح أو خطأ) حالات التفعيل أو الحذف، السمات الثنائية
datetime تاريخ ووقت تاريخ النشر، تاريخ التعديل
date تاريخ فقط تاريخ الميلاد، تاريخ الاستحقاق
binary بيانات ثنائية تخزين ملفات، الصور، بيانات مشفرة
references مفتاح خارجي (Foreign Key) الربط بين الجداول

خاتمة

تمثل النماذج في Rails جوهر العمل مع البيانات في التطبيقات، فهي الوسيلة الفعالة والمرنة التي تتيح إنشاء التطبيقات بطريقة مهيكلة ومنظمة، مع تحقيق التكامل القوي مع قواعد البيانات. من خلال فهم عميق لعملية إنشاء النماذج، استخدام التحققات، إدارة العلاقات، والتعامل مع عمليات الحفظ والقراءة، يمكن للمطورين بناء تطبيقات تتمتع بالأداء العالي، الأمان، والمرونة. كما تساعد الهجرات في إدارة التطوير بشكل تدريجي ومنظم، ما يجعل صيانة وتحسين قاعدة البيانات عملية سهلة وآمنة. إن maîtrise النماذج في Rails هي مهارة حيوية لأي مطور يسعى لإنشاء تطبيقات ويب متقدمة وقابلة للتوسع.


المصادر والمراجع