create table orders (
id 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...
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类型该列值被保存在个rubyTime类型对象中我们可以写些代码来验证该列类型及其内容:
order = Order.
order.shipped_at = "2005-03-04 12:34"
pp order.shipped_at.
pp order.shipped_at
输出为:
Time
Fri Mar 04 12:34:00 CST 2005
下面列表展示了sql和ruby间数据类型对应关系:
SQLType Ruby Class SQLType Ruby Class
, eger Fixnum float, double Float
decimal, numeric Float char, varchar, String
clob, blob, text String datetime, time Time
erval, date Date Boolean 后面详细介绍
有个潜在可能是有关decimal在数据库里使用decimal列来存储number和fix number型Active Record将decimal映射成Float类对象尽管这样可以应用于大多数应用浮点数是不精确在对这类型属性进行系列操作时候可能会发生舍入你也许可以使用eger类型来作为替代方案例如存储货币型时候可以将元角分分别存入区别字段做为种选择你可以使用聚合(aggregations)使用多个分开字段来构建货币类型
最新评论