Active Record – Rails 中的物件關聯性對應
Active Record 將類別連接到關聯式資料庫表格,以建立幾乎零設定的應用程式持久層。此函式庫提供一個基底類別,當子類化時,會設定新類別與資料庫中現有表格之間的對應。在應用程式的脈絡中,這些類別通常稱為模型。模型也可以連接到其他模型;這會透過定義關聯性來完成。
Active Record 仰賴命名,因為它使用類別和關聯性名稱來建立各自資料庫表格和外來金鑰欄位之間的對應。雖然可以明確定義這些對應,但建議遵循命名慣例,特別是在開始使用函式庫時。
您可以在 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
-
值物件的聚集。
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 # the `invalidate_payment_plan` method gets called just before Person#destroy end
-
繼承層級。
class Company < ActiveRecord::Base; end class Firm < Company; end class Client < Company; end class PriorityClient < Client; end
-
交易。
# Database transaction Account.transaction do david.withdrawal(100) mary.deposit(100) end
-
欄位、關聯性和聚集的反射。
reflection = Firm.reflect_on_association(:clients) reflection.klass # => Client (class) Firm.columns # Returns an array of column descriptors for the firms table
-
透過簡單的轉接器進行資料庫抽象化。
# connect to SQLite3 ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'dbfile.sqlite3') # connect to MySQL with authentication ActiveRecord::Base.establish_connection( adapter: 'mysql2', host: 'localhost', username: 'me', password: 'secret', database: 'activerecord' )
了解更多並閱讀內建支援 MySQL、PostgreSQL 和 SQLite3 的資訊。
-
ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT) ActiveRecord::Base.logger = Log4r::Logger.new('Application Log')
-
使用遷移的資料庫非特定性架構管理。
class AddSystemSettings < ActiveRecord::Migration[7.1] 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 是物件關係對應 (ORM) 的實作,由 Martin Fowler 描述的同名 模式
「一個包裝資料庫表格或檢視中某列的物件,封裝資料庫存取,並在該資料上新增網域邏輯。」
Active Record 嘗試提供一個連貫的包裝器,作為物件關係對應不便之處的解決方案。此對應的主要準則,是將建構真實世界網域模型所需的程式碼量降至最低。這可透過依賴許多慣例來實現,這些慣例讓 Active Record 能夠輕鬆地從最少的明確指示中推論出複雜的關係和結構。
慣例重於組態
-
沒有 XML 檔案!
-
大量的反射和執行時期延伸
-
魔法本身並非一個壞字
承認資料庫
-
讓您可以在特殊情況和效能下使用 SQL
-
不會嘗試複製或取代資料定義
下載和安裝
Active Record 的最新版本可以使用 RubyGems 安裝
$ gem install activerecord
原始碼可以作為 GitHub 上 Rails 專案的一部分下載
授權
Active Record 在 MIT 授權下釋出
支援
API 文件位於
Ruby on Rails 專案的錯誤回報可以提交到這裡
功能要求應在這裡的 rails-core 郵件列表中討論