首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Ruby on Rails ActiveRecord 深度解析:慣例映射、快速 CRUD 與完整登入範例

     編輯:Java 相關知識

ActiveRecord 是 Rails 的核心 ORM 層,以「慣例優於設定」消除 XML 映射檔,實現極速資料庫操作。官方宣稱生產力達 Hibernate 的 10 倍。本文涵蓋映射規則、資料庫連線、CRUD 操作、關聯定義,並以完整登入系統為例示範整合 Controller 與 View。

ActiveRecord 映射四大慣例

映射層面慣例規則自訂方式
類別 ↔ 資料表類別名單數(CamelCase)→ 表名複數(snake_case)
LineItem → line_items
set_table_name "my_orders" 或 self.table_name = "my_orders"
欄位 ↔ 屬性執行期動態讀取 Schema,自動定義 Getter/Setter無需配置,serialize 可處理特殊型別
主鍵 ↔ id預設主鍵欄位名為 id,型別 integerset_primary_key "order_id"
記錄 ↔ 物件每列對應一物件,欄位值成屬性值find 系列方法回傳物件或集合

SQL 型別對應 Ruby 型別

int/integer      -> Fixnum
decimal/numeric  -> Float
date/interval    -> Date
clob/blob/text   -> String
float/double     -> Float
char/varchar     -> String
datetime/time    -> Time

四步驟使用 ActiveRecord

  1. 建表遵循慣例:表名複數、PK 為 id integer auto_increment、FK 為 model_id
  2. 資料庫連線:config/database.yml 定義環境設定(development/production/test)
  3. 建立 Model:class Order < ActiveRecord::Base; end 一行完成映射
  4. CRUD 操作:

建立記錄

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)
);

database.yml

development:
  adapter: mysql
  database: test
  encoding: utf8
  username: root
  password: 1234
  host: localhost

Model:app/models/user.rb

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

Controller:app/controllers/login_controller.rb

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

View:app/views/login/login.rhtml

<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 %>

進階關聯:has_many / belongs_to

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 高生產力的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved