المكتبة Active Record في ريلز
إنَّ Active Record هو مكتبة تربط أصنافًا بجداول قاعدة بيانات علائقية لتأسيس طبقة ثابتة لا تحتاج إلى ضبط للتطبيقات. توفر المكتبة صنفًا أساسيًّا يضبط - عند تفريع أصناف منه - العلاقة الرابطة بين الصنف الجديد وجدول موجود مسبقًا في قاعدة البيانات. في سياق أي تطبيق، يشار إلى هذه الأصناف عادةً على أنها «نماذج» (models). يمكن ربط النماذج Models أيضًا بنماذج أخرى عبر تعريف ارتباطات.
يعتمد Active Record كل الاعتماد على التسمية، إذ يستعمل أسماء الصنف والارتباط لتأسيس علاقة رابطة (mapping) بين جداول قاعدة البيانات المقابلة وحقول المفتاح الأجنبي (foreign key columns). رغم أنَّ هذه العلاقات الرابطة يمكن أن تُعرَّف بصريح العبارة، فإن الأفضل اتباع عرف التسمية المُتبَّع خصوصًا إن كنت قد بدأت للتو باستعمال المكتبة.
لمعرفة المزيد، ابدأ بقراءة دليل أساسيات Active Record.
إليك لمحة مختصرة عن بعض أهم الميزات التي توفرها Active Record:
- أتمتة عملية ربط الأصناف مع الجداول، الخاصيات مع الحقول:
class Product < ActiveRecord::Base
end
يُربَط الصنف Product
مع الجدول ذي الاسم products
تلقائيًّا والذي قد يبدو بالشكل التالي:
CREATE TABLE products (
id bigint NOT NULL auto_increment,
name varchar(255),
PRIMARY KEY (id)
);
هذا أيضًا سوف يُعرِّف اللواحق التالية: Product.name
و Product.name=(new_name)
.
- إنشاء ارتباطات بين الكائنات المعرفة عبر توابع الصنف البسيط (simple class methods).
class Firm < ActiveRecord::Base
has_many :clients
has_one :account
belongs_to :conglomerate
end
- تجميع قيمة الكائنات (value objects):
class Account < ActiveRecord::Base
composed_of :balance, class_name: 'Money',
mapping: %w(balance amount)
composed_of :address,
mapping: [%w(address_street street), %w(address_city city)]
end
- احتوائها على قواعد التحقق من الصحة التي تُفرِّق بين الكائنات الجديدة والقديمة:
class Account < ActiveRecord::Base
validates :subdomain, :name, :email_address, :password, presence: true
validates :subdomain, uniqueness: true
validates :terms_of_service, acceptance: true, on: :create
validates :password, :email_address, confirmation: true, on: :create
end
- توفير ردود نداء من أجل كامل دورة الحياة (إنشاء نسخة، وحفظها، وتدميرها، والتحقق منها ...إلخ):
class Person < ActiveRecord::Base
before_destroy :invalidate_payment_plan
# مباشرةً Person#destroy قبل `invalidate_payment_plan` يستدعى التابع
end
- وجود هيكلية وراثة هرمية (Inheritance hierarchies):
class Company < ActiveRecord::Base; end
class Firm < Company; end
class Client < Company; end
class PriorityClient < Client; end
- توفير إمكانية إجراء عمليات على قاعدة البيانات مثل:
# إجراء عملية على قاعدة البيانات
Account.transaction do
david.withdrawal(100)
mary.deposit(100)
end
- انعكاس الإجراءات على الحقول والارتباطات والتجميعات (aggregations):
reflection = Firm.reflect_on_association(:clients)
reflection.klass # => Client (class)
Firm.columns # Returns an array of column descriptors for the firms table
- تجريد قاعدة البيانات (Database abstraction) عبر محولات بسيطة:
# SQLite3 الاتصال بقاعدة البيانات
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'dbfile.sqlite3')
# مع إجراء استيثاق MySQL الاتصال بقاعدة البيانات
ActiveRecord::Base.establish_connection(
adapter: 'mysql2',
host: 'localhost',
username: 'me',
password: 'secret',
database: 'activerecord'
)
ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT)
ActiveRecord::Base.logger = Log4r::Logger.new('Application Log')
- إدارة مخطط قاعدة البيانات عبر التهجيرات (Migrations):
class AddSystemSettings < ActiveRecord::Migration[5.0]
def up
create_table :system_settings do |t|
t.string :name
t.string :label
t.text :value
t.string :type
t.integer :position
end
SystemSetting.create name: 'notice', label: 'Use notice?', value: 1
end
def down
drop_table :system_settings
end
end
فلسفة Active Record
إن Active Record هو تنفيذٌ للنمط ORM (اختصار للعبارة Object Relational Mapping أي نمط "ربط الكائنات العِلاقيَّة"). يحاول Active Record توفير مُغلِّف متكامل لإخفاء التعقيد غير المُحبَّب لنمط ربط الكائنات العلاقية. الغرض الأساسي لهذا الربط هو تقليل كمية الشيفرة المطلوبة لبناء نموذج ذي نطاق حقيقي (real-world domain model). هذا يفتح إمكانية الاعتماد على عدد الأعراف (conventions) التي تُسهِّل مهمة Active Record لتخمين العلاقات والهيكليات المعقدة عبر عدة توجيهات بسيطة وواضحة.
التنزيل والتثبيت
يمكن تنزيل أحدث إصدار من مكتبة Active Record مع جوهرة روبي عبر:
$ gem install activerecord
يمكن تنزل الشيفرة المصدرية كجزء من مشروع ريلز على GitHub.