المكتبة Active Record في ريلز

من موسوعة حسوب
< Rails
مراجعة 14:54، 20 مارس 2019 بواسطة جميل-بيلوني (نقاش | مساهمات) (إنشاء الصفحة.)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

إنَّ 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)‎.

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'
)
  • دعم التسجيل (logging) من أجل Log4r و Logger:
ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT)
ActiveRecord::Base.logger = Log4r::Logger.new('Application Log')
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.