|
|
3#

楼主 |
发表于 2007-10-9 10:45:59
|
只看该作者

三、使用活动记录(Active Record)进行数据映射
在上面给出的例子中也许有一个地方最令人迷惑。就是在上述五步中并未给出要操作的是哪一个表。那么rails如何得知我们要操作records表呢?这一点就要从rails中的活动记录说起。
Rails提供了一种非常方便的数据映射机制 - 活动记录。这种机制可以使用尽可能少的代码将一个数据表映射成ruby对象。为了达到这一目的,rails给出了一些约定。如上面的例子的第四步中使用了 Record作为映射数据表的类名,而如果不明确指定所映射的表名时,rails就将这个类名后加s作为表名,即records。下面的代码是一个关于活动记录的例子。
require 'rubygems'
require_gem 'activerecord'
class Record < ActiveRecord::Base
# set_table_name('tablename')
establish_connection(
:adapter => "mysql",
:host => "localhost",
:username => "root",
:password => "password",
:database => "autoweb_development"
)
end
record = Record.new
record.title = 'abc'
record.content = 'aabbcc'
record.dt = Time.now
if record.save
puts '增加记录成功!'
else
puts '增加记录失败!'
end
运行它 ruby map.rb
上面的代码有4点需要注意一下
1. 活动记录必须从ActiveRecord::Base继承。
2. 除了使用databvase.yml设置数据库连接信息外,还可以通过establish_connection将数据库连接信息写在程序中。
3. 使用活动记录映射数据表一般并不需要将表中的每个字段定义在类中,默认情况下这字段名就是类的属性名。
4. 如果不想使用约定来确定表名,可以通过set_table_name指定其它的表名。
四、使用ruby on rails实现一个在线日记程序
为了更好地理解如何利用rails来开发web应用程序,在这一节中我们使用rails手工编写一个在线日记程序。这个程序以一天为单位记录信息。即每一天是一条记录。下面就详细描述这个程序的设计过程:
第一步 初始化
rails diary
cd diary
第二步 建立数据库
create database diary;
create table records (
`id` int(10) unsigned NOT NULL auto_increment,
`title` varchar(50) NOT NULL,
`content` mediumtext NOT NULL,
`date` char(10) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `Index_2` (`date`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
第三步 编写数据表映射类
在app\models中建立record.rb文件,在其中输入如下代码:
class Record < ActiveRecord::Base
establish_connection(
:adapter => "mysql",
:host => "localhost",
:username => "root",
:encoding => "gb2312",
:password => "password",
:database => "diary"
)
end
注: :encoding => "gb2312" 是必须的,如果没有,汉字就无法保存在数据库中了。
第四步 编写控制类
在app\controllers中建立diary_controller.rb文件,在其中输入如下代码。
class DiaryController < ApplicationController
before_filter :configure_charsets
def configure_charsets
@response.headers["Content-Type"] = "text/html; charset=gb2312"
end
def index
end
def write
# 查找当天的记录,看看今天是否已经有日记了
@record = Record.find_by_date(Time.now.strftime("%Y-%m-%d"))
if @record == nil # 如果没有,增加一条记录
@record = Record.new
end
end
def create
@record = Record.find_by_date(Time.now.strftime("%Y-%m-%d"))
if @record == nil
@record = Record.new
@record.date = Time.now.strftime("%Y-%m-%d")
end
# 保存数据
if @record.update_attributes(params[:record])
@saved = true
else
@saved = false
end
end
def query
end
def result
# 得到提供的日期
@year =@request.params["record[date(1i)]"].to_s;
@month = sprintf("%02d", @request.params["record[date(2i)]"].to_s)
@day = sprintf("%02d", @request.params["record[date(3i)]"].to_s)
@query_date = @year + "-" + @month + "-" + @day
@record = Record.find_by_date(@query_date)
end
end |
|