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

Ruby on Rails 開發從頭來(三十八):ActiveRecord 基礎——欄位與屬性映射

     編輯:Java 相關知識

ActiveRecord 如何自動映射資料表欄位?

ActiveRecord 核心特色在於「零配置」:繼承 ActiveRecord::Base 的類別,會在執行時透過資料庫結構自動建立屬性存取器,無需在模型中宣告欄位。

範例:orders 表與 Order 模型

-- SQL 建表
create table orders (
  id int not null auto_increment,
  name varchar(100) not null,
  email varchar(255) not null,
  address text not null,
  pay_type char(10) not null,
  shipped_at datetime null,
  primary key (id)
);

# Ruby 模型
class Order < ActiveRecord::Base
end

執行時檢視欄位資訊

require 'pp'
pp Order.columns.map { |col| col.name }
# => ["id", "name", "email", "address", "pay_type", "shipped_at"]

pp Order.columns_hash['shipped_at']
# => #<ActiveRecord::ConnectionAdapters::Column:0x... @name="shipped_at", @type=:datetime, ...>

型別自動轉換驗證

order = Order.new
order.shipped_at = "2005-03-04 12:34"
pp order.shipped_at.class  # => Time
pp order.shipped_at        # => Fri Mar 04 12:34:00 CST 2005

字串自動解析為 Time 物件,展示 ActiveRecord 的型別轉換能力。

SQL 與 Ruby 型別完整對照

SQL 型別Ruby 類別備註
int, integerFixnum
float, doubleFloat
decimal, numericFloat⚠️ 浮點數精度問題,貨幣建議用整數存分
char, varchar, stringString
clob, blob, textString
datetime, timeTime
dateDate
booleanTrueClass/FalseClass後續詳細說明

Decimal 型別的精度陷阱與替代方案

資料庫 decimal(10,2) 映射為 Ruby Float,連續運算會產生捨入誤差(如 0.1 + 0.2 ≠ 0.3)。解決方案:

  1. 整數存儲法:將金額乘 100 存為整數(分),計算時保持整數,顯示時除以 100 格式化。
  2. 聚合物件:使用 composed_of 將多個欄位(如 dollars, cents)封裝為 Money 值物件,封裝精度邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved