ActiveRecord中的一個對象相當於數據庫中表的一行,對象的屬性對應於表的列,也許你會注意到我們的Order類沒有提及關於orders表的任何東西,這是因為ActiveRecord在運行時來確定這些對應關系,Active Record將數據庫中的模式反應到類中。
我們的orders表可能使用下面的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) );
我們可以創建一個類來轉換這個表:
require 'rubygems' require_gem 'activerecord' # Connection code omitted... class Order < ActiveRecord::Base end
當我們創建了Order類,就可以訪問它的屬性來獲取信息,下面的代碼使用columns()方法,來返回一個Columns對象的數組,在這裡,我們顯示了orders表中的每個列,並且顯示指定字段的詳細信息。
require 'pp' pp Order.columns.map { |col| col.name } pp Order.columns_hash['shipped_at']
運行代碼,會得到下面的輸出:
["id", "name", "email", "address", "pay_type", "shipped_at"] #<ActiveRecord::ConnectionAdapters::Column:0x10e4a50 @default=nil, @limit=nil, @name="shipped_at", @type=:datetime>
注意,Active Record決定了每個列的類型,在這個例子裡,將shipped_at列作為datetime類型,該列的值被保存在一個ruby的Time類型的對象中,我們可以寫些代碼來驗證該列的類型及其內容:
order = Order.new order.shipped_at = "2005-03-04 12:34" pp order.shipped_at.class pp order.shipped_at
輸出為:
Time Fri Mar 04 12:34:00 CST 2005
下面的列表展示了sql和ruby間的數據類型對應關系:
SQLType Ruby Class SQLType Ruby Class int, integer Fixnum float, double Float decimal, numeric Float char, varchar, string String clob, blob, text String datetime, time Time interval, date Date Boolean 後面詳細介紹
有一個潛在的可能是關於decimal的,在數據庫裡,使用decimal的列來存儲number和fix number型,Active Record將decimal映射成Float類的對象,盡管這樣可以應用於大多數應用,浮點數是不精確的,在對這一類型的屬性進行一系列操作的時候,可能會發生捨入的錯誤,你也許可以使用integer類型來作為替代方案,例如,存儲貨幣型的時候可以將元,角,分,分別存入不同的字段。做為一種選擇,你可以使用聚合(aggregations),使用多個分開的字段來構建貨幣類型。