ActiveRecord 是 Rails 的核心 ORM 層,以「慣例優於設定」消除 XML 映射檔,實現極速資料庫操作。官方宣稱生產力達 Hibernate 的 10 倍。本文涵蓋映射規則、資料庫連線、CRUD 操作、關聯定義,並以完整登入系統為例示範整合 Controller 與 View。
| 映射層面 | 慣例規則 | 自訂方式 |
|---|---|---|
| 類別 ↔ 資料表 | 類別名單數(CamelCase)→ 表名複數(snake_case)LineItem → line_items | set_table_name "my_orders" 或 self.table_name = "my_orders" |
| 欄位 ↔ 屬性 | 執行期動態讀取 Schema,自動定義 Getter/Setter | 無需配置,serialize 可處理特殊型別 |
| 主鍵 ↔ id | 預設主鍵欄位名為 id,型別 integer | set_primary_key "order_id" |
| 記錄 ↔ 物件 | 每列對應一物件,欄位值成屬性值 | find 系列方法回傳物件或集合 |
int/integer -> Fixnum
decimal/numeric -> Float
date/interval -> Date
clob/blob/text -> String
float/double -> Float
char/varchar -> String
datetime/time -> Time
id integer auto_increment、FK 為 model_idconfig/database.yml 定義環境設定(development/production/test)class Order < ActiveRecord::Base; end 一行完成映射order = Order.new
order.name = "computer"
order.save
# 或
order = Order.create(:name => "computer")
Order.find(100) # 依 PK 查單筆
Order.find(:first, :conditions => "name='computer'")
Order.find(:all, :conditions => ["name = ?", "computer"])
Order.find_by_name("computer") # 動態 Finder
order = Order.find(100)
order.name = "car"
order.save
Order.delete(12) # 單筆
Order.delete([3, 54, 100]) # 批次
order.destroy # 觸發 callbacks
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
password CHAR(40),
PRIMARY KEY (id)
);
development:
adapter: mysql
database: test
encoding: utf8
username: root
password: 1234
host: localhost
class User < ActiveRecord::Base
def self.login(name, password)
find(:first, :conditions => ["name = ? AND hashed_password = ?", name, password])
end
def try_to_login
User.login(self.name, self.password)
end
end
class LoginController < ApplicationController
def login
@user = User.new(params[:user])
logged_in_user = @user.try_to_login
if logged_in_user
session[:user_id] = logged_in_user.id
redirect_to :action => "index"
else
flash[:notice] = "帳號或密碼錯誤!"
end
end
end
<h1>登入</h1>
<%= error_messages_for 'user' %>
<%= form_tag :action => 'login' %>
<table>
<tr><td>帳號:</td><td><%= text_field 'user', 'name' %></td></tr>
<tr><td>密碼:</td><td><%= password_field 'user', 'password' %></td></tr>
<tr><td></td><td><input type="submit" value="登入" /></td></tr>
</table>
<%= end_form_tag %>
class Post < ActiveRecord::Base
has_many :comments
validates :title, :presence => true, :length => { :minimum => 5 }
end
class Comment < ActiveRecord::Base
belongs_to :post
end
Routes 設定巢狀資源:
resources :posts do
resources :comments
end
ActiveRecord 以慣例消除設定、動態屬性消除 Getter/Setter、豐富 Finder 消除手寫 SQL、關聯聲明消除 JOIN 邏輯。配合 Migration 版控 Schema、Validations 保護資料完整性、Callbacks 處理業務邏輯,構成 Rails 高生產力的基石。