البرمجة

أنواع تحقق البيانات في Rails

Active Record Validations: أنواعها وخياراتها الشائعة

تُعدّ عملية التحقق من صحة البيانات من أهم الخطوات التي يجب أن يمرّ بها أي نظام يعتمد على إدخال وتخزين البيانات. في عالم تطوير تطبيقات الويب باستخدام إطار عمل Ruby on Rails، تُعتبر الـ Active Record Validations إحدى الأدوات الرئيسية التي تضمن دقة وسلامة البيانات قبل حفظها في قاعدة البيانات. تهدف هذه الآلية إلى منع إدخال بيانات غير صحيحة أو ناقصة، مما يحافظ على جودة البيانات واستقرار النظام بشكل عام.

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


مقدمة عن Active Record Validations

Active Record هو المكون المسؤول عن التعامل مع قواعد البيانات في Ruby on Rails، حيث يُمثل كل نموذج (Model) جدولًا في قاعدة البيانات. تعتمد التطبيقات على إدخال البيانات عبر النماذج (Forms) أو الواجهات البرمجية (APIs)، وبدون آلية تحقق قوية من صحة البيانات، قد يؤدي ذلك إلى إدخال بيانات خاطئة، مكررة، أو ناقصة تؤثر على منطق التطبيق وأداءه.

تُعد Validations في Active Record الطريقة المثلى لضبط قواعد التحقق من صحة البيانات على مستوى النموذج، وتتم هذه العملية قبل محاولة حفظ الكائن (Record) في قاعدة البيانات. إذا فشلت عملية التحقق، لا يتم حفظ السجل، ويتم إرجاع أخطاء توضح سبب الفشل، مما يمكن المستخدم أو المطور من اتخاذ الإجراءات اللازمة.


أنواع Active Record Validations الأساسية

تنقسم أنواع التحققات في Active Record إلى مجموعة من الأنواع الأساسية التي تُستخدم بحسب نوع البيانات ومتطلبات التحقق. نذكر فيما يلي أبرز هذه الأنواع:

1. Validation Presence

تُستخدم هذه الطريقة لضمان أن الحقل غير فارغ، أي أن القيمة موجودة ولا تساوي nil أو سلسلة فارغة.

ruby
validates :name, presence: true

تُستخدم بشكل واسع لضمان تعبئة الحقول الأساسية كاسم المستخدم، البريد الإلكتروني، الرقم التعريفي، وغيرها.


2. Validation Uniqueness

تتحقق هذه الخاصية من عدم تكرار القيمة داخل قاعدة البيانات. بمعنى آخر، تضمن أن تكون القيمة فريدة ولا توجد قيمة مماثلة في السجلات الأخرى.

ruby
validates :email, uniqueness: true

عادةً ما تُستخدم للتحقق من تفرد البريد الإلكتروني أو أرقام الهوية.


3. Validation Length

تُستخدم لتحديد الحد الأدنى أو الأقصى لطول السلسلة النصية في الحقل. يمكن أيضًا تحديد طول محدد بدقة.

ruby
validates :password, length: { minimum: 6, maximum: 20 }

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


4. Validation Format

تُستخدم للتحقق من تطابق النص مع نمط معين يُعبر عنه بتعبير منتظم (Regular Expression).

ruby
validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }

تُعد هذه الخاصية مهمة للتحقق من صحة تنسيق البريد الإلكتروني، أرقام الهواتف، رموز التعريف، وغيرها.


5. Validation Numericality

تُستخدم لضمان أن القيمة رقمية، ويمكن إضافة خيارات للتحكم في نوع الرقم كأن يكون عددًا صحيحًا، موجبًا، أو في مدى معين.

ruby
validates :age, numericality: { only_integer: true, greater_than_or_equal_to: 18 }

تُستخدم هذه الخاصية في التحقق من أرقام الهوية، العمر، السعر، والكميات.


6. Validation Inclusion / Exclusion

  • Inclusion: لضمان أن القيمة ضمن مجموعة معينة من القيم المحددة.

  • Exclusion: لضمان أن القيمة ليست ضمن مجموعة معينة من القيم.

ruby
validates :role, inclusion: { in: %w(admin user guest) } validates :username, exclusion: { in: %w(admin superuser root) }

تستخدم لتقييد الحقول إلى مجموعة محددة من القيم المقبولة، مثل أدوار المستخدم أو الحالة.


7. Validation Acceptance

تُستخدم غالبًا للتحقق من قبول المستخدم لشروط الاستخدام أو سياسة الخصوصية، مثل وجود علامة صح في مربع الاختيار.

ruby
validates :terms_of_service, acceptance: true

8. Validation Confirmation

تُستخدم لمطابقة حقلين، كحقلي كلمة المرور وكلمة مرور التأكيد.

ruby
validates :password, confirmation: true

يجب أن يكون هناك حقل مصاحب له باسم password_confirmation في النموذج.


خيارات شائعة في Active Record Validations

إضافة إلى الأنواع الأساسية، تقدم Rails مجموعة واسعة من الخيارات التي تضبط كيفية عمل التحقق، ومنها:

1. :message

يتيح تحديد رسالة مخصصة تُعرض عند فشل التحقق بدلاً من الرسالة الافتراضية.

ruby
validates :email, presence: { message: "يجب إدخال البريد الإلكتروني" }

2. :on

يُحدد وقت تفعيل التحقق، سواء عند الإنشاء :create أو التحديث :update أو كلاهما :save (افتراضي).

ruby
validates :password, presence: true, on: :create

3. :allow_nil و :allow_blank

تتيح تخطي التحقق إذا كانت القيمة nil أو فارغة (سلسلة نصية فارغة).

ruby
validates :nickname, length: { minimum: 3 }, allow_blank: true

يستخدم هذا لتسهيل قبول الحقول غير الإلزامية.


4. :if و :unless

تستخدم لتفعيل أو تعطيل التحقق بناءً على شرط معين (إما رمز ميثود أو تعبير بولياني).

ruby
validates :discount, numericality: true, if: :on_sale? validates :password, presence: true, unless: :admin?

توفر مرونة كبيرة في التحكم بوقت وشروط التحقق.


5. :strict

يحول رسالة الخطأ إلى استثناء Exception بدلاً من إضافتها إلى قائمة الأخطاء، مما يجبر المطور على التعامل مع الخطأ بطريقة مباشرة.

ruby
validates :email, presence: true, strict: true

آلية عمل Active Record Validations

عند محاولة حفظ سجل جديد أو تحديث سجل قائم، يتم تنفيذ جميع التحققات المعرفة في النموذج بشكل متسلسل. في حالة اكتشاف أي خطأ، يتم إيقاف عملية الحفظ ويُعاد الكائن مع قائمة الأخطاء التي يمكن عرضها للمستخدم.

هذه الأخطاء تُخزن في خاصية errors الخاصة بالكائن، ويمكن استرجاعها أو عرضها بسهولة.

مثال:

ruby
user = User.new(email: "") user.valid? # => false user.errors.full_messages # => ["Email can't be blank"]

كيفية إنشاء تحقق مخصص (Custom Validation)

في بعض الحالات، قد تحتاج إلى قواعد تحقق معقدة لا تغطيها التحققات الافتراضية. في هذه الحالة يمكن إنشاء تحقق مخصص عبر طريقتين رئيسيتين:

1. استخدام validate مع ميثود خاص

ruby
validate :check_birth_date def check_birth_date errors.add(:birth_date, "لا يمكن أن يكون في المستقبل") if birth_date > Date.today end

2. إنشاء كلاس تحقق مخصص

ruby
class EmailDomainValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) unless value.ends_with?("@example.com") record.errors.add(attribute, "يجب أن يكون البريد ضمن نطاق example.com") end end end validates :email, email_domain: true

تأثير Validations على أداء التطبيق

تعد Validations عملية خفيفة نسبيًا ولا تسبب تأثيرًا كبيرًا على أداء التطبيق عند استخدامها بشكل صحيح. لكنها تمنع عمليات الحفظ غير الصحيحة، مما يقلل من الحاجة إلى استرجاع البيانات أو تعديلها لاحقًا، وبالتالي تحسن من جودة البيانات وسرعة المعالجة.

في المقابل، إذا كانت هناك قواعد تحقق معقدة جدًا أو تشمل استعلامات قواعد بيانات إضافية، يجب الانتباه إلى تأثيرها على الأداء وتحسينها بما يتناسب مع حجم البيانات وحركة التطبيق.


ملخص أنواع Active Record Validations وخياراتها

نوع التحقق الوصف أمثلة للخيارات الاستخدام الشائع
Presence التحقق من وجود قيمة presence: true ضمان تعبئة الحقول الأساسية
Uniqueness التحقق من تفرد القيمة uniqueness: true منع تكرار البريد الإلكتروني
Length التحقق من طول النص length: { minimum: 3, maximum: 50 } كلمات المرور، أسماء المستخدمين
Format التحقق من تطابق نمط معين format: { with: /regex/ } التحقق من البريد الإلكتروني، الأرقام
Numericality التحقق من كون القيمة رقمية numericality: { only_integer: true } العمر، الكميات، الأسعار
Inclusion / Exclusion التحقق من وجود القيمة ضمن/خارج مجموعة inclusion: { in: [...] } أدوار المستخدم، الحالات
Acceptance التحقق من قبول شروط acceptance: true شروط الخدمة
Confirmation التحقق من مطابقة حقلين confirmation: true كلمات المرور والتأكيد

الخلاصة

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

هذا النهج لا يحمي فقط من الأخطاء، بل يعزز تجربة المستخدم من خلال تقديم رسائل واضحة عند وجود أخطاء في الإدخال، ويسهل صيانة الكود وفهمه عبر تنظيم قواعد التحقق في طبقة النموذج بشكل مركزي ومنسق.


المصادر