ActiveRecord是Rails的物件/關聯映射(Object/Relational Mapping, ORM)解決方案,可以物件角度來進行資料庫操作,將物件與物件關係,映射至關聯資料庫表格與表格的關係,Rails的ActiveRecord方案實現了ActiveRecord 模式,物件本身代表資料表格中的一筆資料,物件本身攜帶資料庫存取的相關操作方法。
先前在 MVC 與 Rails 中曾略為看過ActiveRecord的一些使用,當你使用rails generate model產生指定的資料庫模型物件時,會產生幾個檔案:
\$ rails g model message name:string content:text is_read:boolean
invoke active_record
create db/migrate/20111214072231_create_messages.rb
create app/models/message.rb
invoke test_unit
create test/unit/message_test.rb
create test/fixtures/messages.yml
invoke active_record
create db/migrate/20111214072231_create_messages.rb
create app/models/message.rb
invoke test_unit
create test/unit/message_test.rb
create test/fixtures/messages.yml
以上例而言,*_create_messages.rb記錄了稍後執行db:migrate時要作的動作,其中*是時間標記,用以避免名稱衝突,就之前的指令主要是建立新表格:
- *_create_messages.rb
class CreateMessages < ActiveRecord::Migration
def change
create_table :messages do |t|
t.string :name
t.text :content
t.boolean :is_read
t.timestamps
end
end
end
create_table方法指定建立messages表格,在程式區塊中分別指定t.string、t.text、t.boolean等建立了name、content、is_read欄位,t.timestamps則會自動建立created_at與updated_at兩個欄位,每個表格也會有個自動增生的id欄位作為主鍵。為了執行*_create_messages.rb的內容以建立表格,需要執行db:migrate任務:
~/hello\$ bundle exec rake db:migrate
使用的SQL可在log/development.log中查到:
CREATE TABLE "messages" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"name" varchar(255),
"content" text,
"is_read" boolean,
"created_at" datetime,
"updated_at" datetime
)
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"name" varchar(255),
"content" text,
"is_read" boolean,
"created_at" datetime,
"updated_at" datetime
)