- 浏览: 338284 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
springdata_spring:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
使用Maven管理Android项目(一) -
snowfigure:
snowfigure 写道我专门登陆上来,就是想问问,这个Ve ...
IntelliJ IDEA 生成注册码源程序 -
snowfigure:
我专门登陆上来,就是想问问,这个Version有啥鸟用?定义完 ...
IntelliJ IDEA 生成注册码源程序 -
非诚勿扰男嘉宾:
引用整个包就好了,不用具体类
androidannotations Eclipse下报引用不到框架生成类错误的解决方案 -
jf_emal:
至于大数据量时导致图表渲染慢的问题,可以通过改变业务逻辑及交互 ...
报表展示组件Highcharts与Fusioncharts的对比
用 Ruby on Rails 来编写数据库管理系统是非常快速的。 Ruby on Rails 之所以有如此高的生产率,不光是 Ruby 的语法灵活,而这一切在很大程序上是拜活动记录( Active Record )所赐。那么什么是活动记录呢?如果用一句话来解释,那就是一个可以将数据映射成对象的框架(这有些类似于 Hibernate )。也许你会说: " 这有什么,现在这种框架多得是, Hibernate 不是也非常强大吗? " ,但如果你用了 Ruby on Rails( 以下简称为 RoR) ,你就会发现它和其它的同类框架是多么的不同,它比其它框架更容易使用,编程效率也更高,据官方说,使用 RoR 比使用 Java 和 Hibernate 的生产率高 10 倍(也许并没有这么夸张,但活动记录的数据映射的确比其它框架的数据映射的生产率高一些)。
无论是桌面程序还是基于 Web 的程序,数据处理始终是它们的核心。数据可以使用不同的技术进行描述和处理。
这些数据处理技术之一就是对象关系映射技术,或者简称为 ORM 技术。 ORM 技术将数据库中的数据表或视图映射成了面象对象的类。而 ORM 框架的作用就是架起数据和对象之间的桥梁,以及为桥梁两端的数据和对象提供相应的服务。由于 ORM 框架自成一体,因此,开发人员的主要工作就是将 ORM 框架和其它的框架(如 web 框架)连接起来,从而使它们可以协同工作。
在 ORM 框架家族中, RoR 很特别。 RoR 的核心是 ORM 框架,而这个框架在 RoR 中是以活动记录的形式表现的。在本文中,我们将关注活动记录的一些基本概念和她最诱人的地方:快速连接和操作数据库。本文的第一部分将讨论活动记录的基础知识。第二部分将一步步地指导读者如何使用活动记录快速地连接和操作数据库。在第三部分中我们以一个完整的例子来讨论如何将活动记录和 ActionController 以及 ActionView 一起使用。以上是本文所讨论的主要内容。
什么是活动记录
活动记录是一个 ORM 框架,也可以看做是和 RoR 一起发布的一个数据库映射层。活动记录是 RoR 的核心。活动记录是一个 ORM 层,它提供了以下的映射服务:
1. 将表映射成类
2. 将字段映射成类的属性
3. 将表中的主键映射成 Ids 属性
4. 将行映射成对象
活动记录和其它的 ORM 框架最大的区别是它们的映射方式不同。大多数流行的 ORM 框架(如 Hibernate )是以 XML 作为映射容器。而活动记录采用的是更容易使用的 " 约定 " 方式进行映射。下面让我们来看看活动记录是如何做的。
1.将表映射成类
为了将表映射成类, Ruby 类必须从 ActiveRecord::Base 继承。这个 Base 类在 ActiveRecord 包中。那么一个类从 ActiveRecord::Base 继承后发生了什么呢?实际上这个子类已经和一个数据表相对应了。也许大家看到这有一些迷糊,我除了写一个从 ActiveRecord::Base 继承的空类什么代码都没写,怎么就映射完了。其实这要依靠活动记录的命名约定。活动记录假设一个类名的复数形式(英文类名)就是表名。如果类名中有多个大写字母,那么活动记录就假设表名就是这些单词中间用下划线隔开后连在一起,请看下面的例子。
无论是桌面程序还是基于 Web 的程序,数据处理始终是它们的核心。数据可以使用不同的技术进行描述和处理。
这些数据处理技术之一就是对象关系映射技术,或者简称为 ORM 技术。 ORM 技术将数据库中的数据表或视图映射成了面象对象的类。而 ORM 框架的作用就是架起数据和对象之间的桥梁,以及为桥梁两端的数据和对象提供相应的服务。由于 ORM 框架自成一体,因此,开发人员的主要工作就是将 ORM 框架和其它的框架(如 web 框架)连接起来,从而使它们可以协同工作。
在 ORM 框架家族中, RoR 很特别。 RoR 的核心是 ORM 框架,而这个框架在 RoR 中是以活动记录的形式表现的。在本文中,我们将关注活动记录的一些基本概念和她最诱人的地方:快速连接和操作数据库。本文的第一部分将讨论活动记录的基础知识。第二部分将一步步地指导读者如何使用活动记录快速地连接和操作数据库。在第三部分中我们以一个完整的例子来讨论如何将活动记录和 ActionController 以及 ActionView 一起使用。以上是本文所讨论的主要内容。
什么是活动记录
活动记录是一个 ORM 框架,也可以看做是和 RoR 一起发布的一个数据库映射层。活动记录是 RoR 的核心。活动记录是一个 ORM 层,它提供了以下的映射服务:
1. 将表映射成类
2. 将字段映射成类的属性
3. 将表中的主键映射成 Ids 属性
4. 将行映射成对象
活动记录和其它的 ORM 框架最大的区别是它们的映射方式不同。大多数流行的 ORM 框架(如 Hibernate )是以 XML 作为映射容器。而活动记录采用的是更容易使用的 " 约定 " 方式进行映射。下面让我们来看看活动记录是如何做的。
1.将表映射成类
为了将表映射成类, Ruby 类必须从 ActiveRecord::Base 继承。这个 Base 类在 ActiveRecord 包中。那么一个类从 ActiveRecord::Base 继承后发生了什么呢?实际上这个子类已经和一个数据表相对应了。也许大家看到这有一些迷糊,我除了写一个从 ActiveRecord::Base 继承的空类什么代码都没写,怎么就映射完了。其实这要依靠活动记录的命名约定。活动记录假设一个类名的复数形式(英文类名)就是表名。如果类名中有多个大写字母,那么活动记录就假设表名就是这些单词中间用下划线隔开后连在一起,请看下面的例子。
类名
|
表名
|
Record
|
Records
|
LineItem
|
Line_Items
|
Datum
|
Data
|
以上所描述的是活动记录的默认的映射行为,我们也可以为活动记录定义自已的行为。要改变这些默认的行为,可以按以下步骤做:
1. 将全局变量 ActiveRecord::Base. pluralize_table_names 设为 false 。这个变量被定义在 config 目录中的 environment.rb 中。
2. 可以通过 set_table_name 改变默认的表名。例如,如果将表 Orders 映射成类 Order 的代码如下:
class Order < ActiveRecord::Base
end |
但如果这个类名要映射成 MyOrder ,那么它的实现代码如下:
class Order < ActiveRecord::Base
set_table_name "MyOrder" end |
接下来让我们看看如何将字段映射成属性。
2.将字段转换为属性
在一个数据表被映射成类后,表中的字段就将自动映射成类的属性。这是因为活动记录是在程序运行时动态地将表中的字段映射成类的属性。事实上,在从 ActiveRecord::Base 的类自动将表中的字段包装在了类中。下表将描述 SQL 数据类型将被映射成 Ruby 的哪些数据类型:
SQL 数据类型
|
Ruby 数据类型(类)
|
int, integer
|
Fixnum
|
decimal, numeric
|
Float
|
interval, date
|
Date
|
clob, blob, text
|
String
|
float, double
|
float
|
chat, varchar, string
|
String
|
datetime, time
|
Time
|
下面让我们来讨论主键的映射。
3.将主键映射成Ids
假设有一个 Orders 表,它的主键是 Order_Id 。现在让我们看看这个 Order_Id 字段,这个字段由 16 个数字组成,其中包括 Item id , User Id 等。在以后如果 Order_id 变成 20 位数字,最后 4 位数字是一个 RFID 代码,那么所有依赖这个 Order_id 字段的列都将发生变化。这些工作量是非常大的,即使这个应用程序并不大。然而活动记录确能自动做到这些。自动映射可按如下代码去做:
class Order < ActiveRecord::Base
set_primary_key "orderId" end |
4.将记录映射成对象
无论什么时候,映射类的查询方法被执行时,在内部都会调用相应的 SQL 语句来查询数据库,并且将查询结果返回,这些返回的结果最终以对象的形式表现。列值将成为对象的属性。返回的每一行将被映射成一个对象。例如以下代码将返回 Id 等于 100 的 Order 对象:
an_order = Order.find(100)
|
上面的代码演示了如何得到特定的记录。接下来让我们看一下使用活动记录建立相应的操作的步骤。
使用活动记录的步骤
虽然使用活动记录映射数据表不需要复杂的设置,但我们必须按着活动记录所制定的规范进行操作。这些规范将成为活动记录工作的一部分,以下就是使用活动记录的步骤。
1. 建立表
2. 连接数据库
3. 建立 ORM
4. 进行增、删、改操作
第一步需要完全按着规范来做。建立表的过程一定要严格按着规范进行,否则就会覆盖活动记录的默认值。以下是建立表的详细过程:
1. 建立表
如果你不想在映射时做大量的工作,那么数据表必须按着活动记录所制定的规范来建立。过程如下:
1. 表名应该是复制形式(如 orders )。
2. 主键应该被命名为 Id ,它的数据类型应该是整型。
如果某个表引用了另外一个表,那么这个表的外键应该按如下格式取名:
<表名的单数形式> _id
因此,按着上面两条规范建立 orders 表的 SQL 语句( MySQL 数据库)如下:
create table orders (
id int not null auto_increment, name varchar(50) not null, … … primary key (id) ); |
2. 连接数据库
就象 RoR 的其它操作一样,数据库的连接也是非常快速的。这就意味着活动记录在内部做了很多的工作,如自动侦测特定的数据库适配器的细节。为了连接数据库,必须使用相应的连接参数调用 Base 类的 establish_connection() 方法。这些参数根据数据库的不同而不同。下面的语句是使用 establish_connection 通过用户名、密码、数据库等信息连接本机 MySQL 数据库,其中 "encoding = > gb2312" 是为了操作中文所需。
establish_connection(
:adapter = > "mysql", :host = > "localhost", :username = > "root", :encoding = > "gb2312", :password = > "1234", :database = > "test" ) |
3. 建立 ORM
在建立完数据库和表后,下一步就是将这个数据表映射成 Ruby 的类。我们从上述可知, RoR 映射数据表是非常快的。只要一个类从 ActiveRecord::Base 继承,数据表就自动映射成了 Ruby 类(类名为表名的单数形式)。下面是将 orders 表映射成 Order 类的代码:
class Order < ActiveRecord::Base
… … end |
4. 进行增、删、改操作
对一个数据表最常用的三种操作就是增、删、改。这也是一个数据库应用程序的其本的操作。使用活动记录对数据表进行这三种操作是非常容易的。下面的代码将描述如何使用活动记录对数据进行这三种操作。
· 增加记录
增加记录是在建立一个空表后应该做的第一件事。在活动记录中为我们建立了 new 方法来向表中增加记录,并通过 update_attributes 方法保存新增加的记录。代码如下:
order = Order.new
order.name = "computer" order.update_attributes(params[:order]) |
· 删除记录
为了删除记录,活动记录提供了 delete 方法。这个方法支持单行删除,也支持多行删除。以下语句删除了 id 等于 12 的记录:
Order.delete(12)
|
下面的语句删除了多条记录:
Order.delete([3, 54, 100])
|
· 修改记录
在修改记录之前,首先要确定要修改的记录,这一过程一般使用查询来完成。因此,修改就是查询和更新记录的组合。如下面的语句将 id=100 的记录中的 name 的值改为 "car" 。
order = Order.find(100)
order.name = "car" order.save |
上面的代码只是粗略地描述了一下活动记录的功能。我们将在下面的实例中演示如何将活动记录和 ActionController 以及 ActionView 一起使用建立一个登录程序。
实例
这个登录程序非常简单。下面将描述这个程序的基本功能:
这个程序有一个窗口允许用户输入用户名和密码。在输入用户名和密码后,系统将会验证它们的合法性。在用户登录后,系统将这个用户的信息记录在 session 中,直到它们注销登录。
下面将描述组成系统的模块:
User.rb - 数据表 (users) 的映射
login_controller.rb - 控制前端和后端的数据流
login.rhtml - 显示登录界面
下面是建立 users 表的 SQL 语句:
这个登录程序非常简单。下面将描述这个程序的基本功能:
这个程序有一个窗口允许用户输入用户名和密码。在输入用户名和密码后,系统将会验证它们的合法性。在用户登录后,系统将这个用户的信息记录在 session 中,直到它们注销登录。
下面将描述组成系统的模块:
User.rb - 数据表 (users) 的映射
login_controller.rb - 控制前端和后端的数据流
login.rhtml - 显示登录界面
下面是建立 users 表的 SQL 语句:
create table users (
id int not null auto_increment, name varchar(100) not null, password char(40) null, primary key (id); } |
接下来我们处理数据表映射类。由于我们正在使用 RoR 中的活动记录。因此,除了可以使用 establish_connection 方法连接数据库外,我们还可以使用 config 目录中的 database.yml 文件来描述数据库连接信息。如下是在 database.yml 的 development 中的设置情况:
development:
adapter: mysql database: test encoding: gb2312 username: root password: 1234 host: localhost |
然后使用以下命令建立数据表映射类 User :
ruby script/generate model User
|
这个 User 类包含两个方法: try_to_begin (这个方法调用 login 方法)和 login 。代码如下:
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 |
Login 方法使用了 find 方法查询 users 表中的记录,并进行验证。这个方法的逻辑是非常简单的: try_to_login 方法通过 controller 被调用。然后将用户名密码传入 login 方法中。 Login 方法返回包含用户名和密码的数据对象。
接下来我们使用如下命令建立控制类:
ruby script/generate controller Login
|
以下代码是控制类的实现,其中包括数据验证和处理 session 。
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 |
下面是 login.rhtml 的代码
< % @page_title = " 增加一个用户 " -% >
< %= error_messages_for 'user' % > < %= form_tag % > < table > < tr > < td > User name: < /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=" ADD USER " / >< /td > < /tr > < /table > < %= end_form_tag % > |
到现在这个程序已经完成了。如果你将这个应用程序和使用其它语言编写的同样的应用程序相比,基于 RoR 的应用程序的代码是非常少的。本文只是对活动记录的主要功能进行简单的描述,如果读者对其感性趣,可以查阅相关的文档了解更详细信息。
发表评论
-
[转]ubuntu12.04搭建ruby on rails 环境
2012-05-14 10:28 1209经过几天的实验,终于 ... -
从JUnit到Rspec的尝试
2012-05-02 17:42 1526如今,各种测试框架层 ... -
rails走验证和不走验证方法汇总
2012-04-19 16:00 1932之前有一篇文章写到,在使用update_attribute方法 ... -
rvm实用指南(四)——切换ruby1.9.3报错
2012-04-18 22:11 686用RVM安装ruby后,运行ruby 1.9.3 ... -
rvm实用指南(三)——安装ruby1.9.3报错
2012-04-17 15:52 1454今天在用rvm install 1.9.3时,报了些莫 ... -
rails中单独更新某一属性,不走model层的validate
2012-04-10 17:18 1439在做Rspec测试时,有一用例如下 desc ... -
ruby--Hash方法汇总(转)
2012-03-27 16:53 1400一。给Hash添加默认值 : Ruby代码 ... -
Rails中数据库查询分组的几种方式
2012-03-06 11:47 1745方式一: ruby代码方式: machine_group ... -
推荐 Gem 列表(转)
2012-02-20 16:20 607详情请见: http://ruby-china.org/wik ... -
搭建redmine过程中遇到的问题
2012-02-06 16:13 1282最近想搭建一下redmine,好学习一下这个开源源码。 但 ... -
安装特定版本的rails
2012-02-03 11:52 730gem install rails --version=< ... -
rvm实用指南(二)(转)
2012-02-03 11:48 1375RVM简介 Ruby Version Manager,Ru ... -
rvm实用指南(一)(转)
2012-02-02 21:07 995rvm是一个命令行工具,可以提供一个便捷的多版本r ... -
rails中怎么把小数取成两位的小数(四舍五入)?
2011-10-10 13:07 160522.1231234.round(2) (" ... -
Ubuntu下bundle install报错
2011-09-28 15:56 3783Ubuntu下bundle install命令报错 / ... -
Ubuntu下rvm使用的几个命令
2011-09-28 15:32 807在删除bundler gem包时出现错误,解决措施如下: ... -
Rails读写分离实现
2011-08-30 11:17 1840报表组件读写分离实现 由于Kelude数据量不断增大 ... -
ruby on rails如何将时间段换算成天数
2011-08-25 11:23 1772#将时间点做差,并转换成天数 time = (" ... -
.nil? , .empty?, .blank? .present? 的区别(转)
2011-08-23 20:46 806首先这三个都是判空的。 而 .nil? 和 .empty? ... -
由表及里解析Rails路由(转)
2011-07-14 21:53 1190转自 http://hlee.iteye.com/bl ...
相关推荐
Ruby on Rails Guides v2 - Ruby on Rails 4.2.5
Ruby on Rails: Up and Running
本书教您如何使用Ruby on Rails开发和部署真正的,具有工业实力的Web应用程序,Ruby on Rails是为诸如Twitter,Hulu,GitHub和Yellow Pages等顶级网站提供支持的开源Web框架。
《Ruby on Rails Tutorial》中文版(原书第2版,涵盖 Rails 4) Ruby 是一门很美的计算机语言,其设计原则就是“让编程人员快乐”。David Heinemeier Hansson 就是看重了这一点,才在开发 Rails 框架时选择了 Ruby...
Ruby On Rails中文教材(PDF)
Ubuntu系统ruby on rails安装 Ubuntu系统ruby on rails安装 Ubuntu系统ruby on rails安装 Ubuntu系统ruby on rails安装 Ubuntu系统ruby on rails安装 Ubuntu系统ruby on rails安装 Ubuntu系统ruby on rails安装 ...
ruby on rails社区网站开发源码
“The author is clearly an expert at the Ruby language and the Rails framework, but more than that, he is a working software engineer who introduces best practices throughout the text.” —Greg ...
Ruby on Rails Web开发学习实录 内容简介: 在目前的主流web开发技术中,基于ruby语言的rails框架是做网站开发速度最快的工具。它可以达到j2ee框架开发速度的5~10倍,并且代码量也非常少。另外由于代码量的大幅度...
ruby on rails对mongodb的操作ruby on rails对mongodb的操作ruby on rails对mongodb的操作ruby on rails对mongodb的操作
Ruby.on.Rails.Tutorial,Learn.Web.Development.with.Rails,Third.Edition-中文版 文字版.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
Web开发:Ruby on Rails.pdf
Ruby On Rails 官方教程,这本书讲解如何使用 Ruby on Rails 框架开发应用,以及如何把应用部署到生成环境。本书使用 Rails 默认的开发工具栈开发了一个完整的社交应用(类似 Twitter)。读完本书后你将掌握如何使用...
Ruby on Rails中文指南
本书的目标是成为对“如果想学习使用 Ruby on Rails 进行 Web 开发,我应该从哪儿开始?”这一问题的最好答案。学习完本书的内容之后,你将具备使用 Rails 进行开发和部署 Web 程序的技能。同时你还能够通过一些进阶...
ruby on rails 教程源码,配合原书使用
ruby on rails 开发环境包(ruby1.8.7,rails2.2.3)
ruby on rails最新版 这是本人精心收集的重要软件