结合使用 Oracle 和 Ruby on Rails

目的

本教程介绍如何使用 Oracle 安装 Ruby/Rails,以及如何开发高效且功能强大的 Ruby/Rails 应用程序。您将获得为企业创建强大的 Ruby/Rails 应用程序所需的知识。

主题

本教程包括下列主题:

 概述
 前提条件
 1. 创建连接
 2. 查询数据
 3. 绑定变量
 4. 定义数据类型
 5. 事务管理
 6. 使用 PL/SQL
 7. 使用 LOB:存储/检索图像
 8. 使用 XML
 9. 使用 ActiveRecord
 10. Ruby On Rails (RoR):移植和结构
 11. RoR:表之间的一对一关系
 12. RoR:表之间的一对多关系
 13. RoR:表之间的多对多关系
 总结
 相关信息
 附录:Ruby 入门
 附录:如何使用 Rails 移植修改数据库表
 附录:通过 Oracle 安装 Ruby on Rails

查看屏幕截图

 将鼠标置于此图标上 可以加载和查看本教程的所有屏幕截图。(警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)

注:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图来将其隐藏。

概述

Ruby on Rails 是一个免费的 Web 应用程序框架,旨在提高创建数据库驱动的 Web 站点的速度和方便性,并从一开始就提供主要代码框架(结构)。通常缩写为 RailsRoR,Ruby on Rails 是一个用 Ruby 编程语言编写的开源项目,使用 Rails 框架的应用程序是用模型-视图-控制器设计模式开发的。

RoR 在 J2EE 和 PHP 编程人员中备受推崇。当您了解 RoR 的优势后,它对 J2EE 和 PHP 编程人员的吸引力具有重要作用。首先,它使用任何自视甚高的设计模式都很钦佩的严格的模型-视图-控制器体系结构 — 这可以解释它为什么吸引了大量 J2EE 开发人员。其次,使用 Rails 可以轻松地构建基本系统 — 这对 PHP 开发人员具有吸引力。

RoR 为 MVC 提供了令人满意的解决方案。模型不仅仅是数据;它执行适用于该数据的所有业务规则。模型既可充当网关守卫又可充当数据存储。视图通常基于模型中的数据生成一个用户界面。尽管视图可能会通过各种方式向用户显示输入的数据,但视图本身从不处理传入的数据。数据显示之后,视图的工作就完成了。控制器接收来自外界的事件(通常是用户输入),与模型进行交互,并向用户显示相应的视图。

RoR 将 ActiveRecord 作为对象关系映射 (ORM) 层提供,以便连接数据库和操作数据。ActiveRecord 严格遵循标准的 ORM 模型:表映射到类,行映射到对象,列映射到对象属性。

创建 Rails 应用程序时,将在根目录下生成以下目录和文件:app、components、config、db、doc、lib、log、public、Rakefile、README、script、test、tmp 和 vendor。

Ruby 是一种动态的开源编程语言,重点关注简单性和工作效率。其简洁的语法易于阅读、便于编写。要了解有关 Ruby 语言的更多信息,参见 附录:Ruby 入门

要获得更多信息,您可以访问 Ruby on Rails OTN 论坛。

返回主题列表

前提条件

为了学习该动手操作讲座,需要安装以下软件:

1.

安装 Oracle 数据库快捷版或 Oracle 数据库 11g。

2.

安装 Oracle 即时客户端和 OracleOnRails(ruby、rubygems、activesupport、activerecord、rake、ruby-oci8 等)。还需要配置模式。参见 附录:通过 Oracle 安装 Ruby on Rails 中的下列说明。

3.

下载并解压缩 rubyrails.tar 文件。该文件包含执行本教程所需的所有文件。

返回主题列表

1. 创建连接

您将在本部分中使用以下命令:

OCI8.new (userid, password, dbname = nil, privilege = nil):

通过 userid 和 password 连接到 Oracle。dbname 是 Net8 的连接字符串。如果您需要 DBA 权限,则将 privilege 设置为 :SYSDBA 或 :SYSOPER。

 

OCI8#logoff

断开与 Oracle 的连接。将回滚未提交的事务。

OCIError 包含 Oracle 的错误代码的异常类。您可以通过 OCIError#message 获得错误消息,通过 OCIError#code 获得错误代码。

创建 ruby 脚本过程中的第一个任务是创建到数据库的连接。执行以下步骤:

1.

在终端窗口中,通过执行以下命令来执行 connect.rb 脚本:

                                 
ruby connect.rb
                              

如果连接成功,您会看到以下消息;如果连接失败,您将看到一条错误消息。

 

2.

本教程的其余脚本中将包括以下命令:

                                 
require 'config.rb'
           
 #create connection
 conn = OCI8.new(DB_USER, DB_PASSWORD, DB_SERVER)
 
 # operations on conn goes here
 
  
                                
#log out
 conn.logoff
                              

 

返回主题列表

2. 查询数据

您将在本部分中使用以下命令:

OCI8#parse (sql)

创建一个游标,准备执行 SQL 语句并返回 OCI8::Cursor 的实例。

OCI8#exec (sql, *bindvars)

执行 SQL 语句。返回值的类型取决于 SQL 语句的类型。指定 bindvars 后,它们在执行前作为绑定变量进行绑定。

OCI8::Cursor#exec(*bindvars) 执行用游标分配的 SQL 语句。返回值的类型取决于 SQL 语句的类型。
OCI8::Cursor#getColNames 将选择列表的名称作为数组获取。在执行后使用此方法。

要创建一个简单查询并显示结果,执行以下步骤。

1.

在终端窗口中,通过执行以下命令来执行 fetch.rb 脚本:

                                 
ruby fetch.rb
                              

其输出显示在屏幕截图中。

 

2.

还可以通过另一种方式编写更针对于 ruby 的相同的代码。在终端窗口中,通过执行以下命令来执行 fetch_r.rb 脚本:

                                 
ruby fetch_r.rb
                              
                                 
其输出显示在屏幕截图中。
                              

 

返回主题列表

3. 绑定变量

绑定变量提高了代码可重用性,消除了 SQL 注入攻击的风险。您将在本部分中使用以下命令:

OCI8::Cursor#bind_param(key, val, type = nil, length = nil)

显式绑定变量。当 key 为数字时,它通过位置绑定(从 1 开始)。当 key 为字符串时,它通过占位符名称绑定。

OCI8#exec (sql, *bindvars) or OCI8::Cursor#exec(*bindvars)

也可以通过 bindvars 绑定变量。

OCI8::Cursor#[key] 获取/设置绑定变量的值。

要在本示例中使用绑定变量,执行以下步骤。

1.

在终端窗口中,通过执行以下命令来执行 bind.rb 脚本:

                                 
ruby bind.rb
                              

其输出显示在屏幕截图中。

 

2.

要使用绑定变量测试性能改善,通过执行以下命令来执行 bind_perf_test.rb 脚本:

                                 
ruby bind_perf_test.rb
                              
                                 
其输出显示在屏幕截图中。
                              


 

返回主题列表

4. 定义数据类型

您将在本部分中使用以下命令:

OCI8::Cursor#define(pos, type, length = nil)

在分析和执行过程中使用该方法。pos 从 1 开始。当 type 为 String 时使用 length。

您可以显式指明获取的值的数据类型。要在本示例中定义数据类型,执行以下步骤。

1.

在终端窗口中,通过执行以下命令来执行 define.rb 脚本:

                                 
ruby define.rb
                              

其输出显示在屏幕截图中。

您会看到两个输出块之间的差别。

 

返回主题列表

5. 事务管理

在 Oracle 数据库中操作数据(插入、更新或删除数据)时,更改的数据或新数据在提交到数据库中之前仅在数据库会话中可用。更改的数据提交至数据库,然后可供其他用户和会话使用。这是一个数据库事务。

单独提交每个更改会额外增加服务器的负载。通常,您希望提交所有数据或者都不提交。进行您自己的事务控制具有性能和数据完整性优势。

您将在本部分中使用以下命令:

OCI8#autocommit

获取/设置自动提交模式的状态。默认值是 false(记住:注销时不回滚未提交的事务)。如果为 true,每次执行 insert/update/delete 语句时都自动提交事务。

OCI8#commit() 提交事务。
OCI8#rollback() 回滚事务。

要了解如何管理事务,执行以下步骤。

1.

在终端窗口中,通过执行以下命令来执行 transaction.rb 脚本:

                                 
ruby transaction.rb
                              

该脚本使用 conn1 连接更新一行。在 Oracle 中,新数据在提交前仅在原始数据库会话中可见。其输出显示在屏幕截图中。

在这种情况下,conn2 连接不知道 conn1 的未提交事务发生了什么。

 

2.

更新 transaction.rb 脚本,取消对 conn1.autocommit = true 的注释,然后保存文件。

使用以下命令再次执行脚本:

                                 
ruby transaction.rb
                              

现在,conn2 知道哪些内容是新增的。其输出显示在屏幕截图中。

 

3.

单独提交每一行会额外增加服务器的负载。您可以比较单独提交每行与在事务结束后提交之间的性能差异。要测试差别,使用以下命令执行 trans_perf_test.rb 脚本:

                                 
ruby trans_perf_test.rb
                              

注意,第二个数字比第一个数字小。其输出显示在屏幕截图中。

 

返回主题列表

6. 使用 PL/SQL

PL/SQL 是 Oracle 对 SQL 的过程语言扩展。PL/SQL 存储过程和函数存储在数据库中,因此其访问速度非常快。使用 PL/SQL 存储过程允许所有数据库应用程序重用逻辑,无论应用程序以何种方式访问数据库。许多与数据相关的操作在 PL/SQL 中的执行速度比将数据提取到一个程序中(例如,Ruby)然后再进行处理的速度快。

您将在本部分中使用以下命令:

DBMS_UTILITY 和 DBMS_OUTPUT

Oracle 存储程序包。TO_CHAR 是一个内置函数。

要在 Ruby 脚本中调用 PL/SQL 过程和函数,执行以下步骤。

1.

在终端窗口中,通过执行以下命令来执行 plsql.rb 脚本:

                                 
ruby plsql.rb
                              

其输出显示在屏幕截图中。

 

返回主题列表

7. 使用 LOB:存储/检索图像

Oracle 字符大对象 (CLOB) 和二进制大对象 (BLOB) 列(以及 PL/SQL 变量)可以包含大容量 (GB) 的字符和二进制数据。您将在本部分中使用以下命令:

OCI8::BLOB#available

检查 BLOB 是否可用。要使用 BLOB,您首先需要插入 EMPTY_BLOB()。

OCI8::BLOB#read(size = nil) 从 BLOB 读取最大的字节大小,如果大小省略,则读取到文件结束处。
OCI8::BLOB#write(string) 将给定的字符串写入到 BLOB。

要创建一个小型应用程序以将图像加载并显示到数据库,执行以下步骤。

1.

脚本文件所在的文件夹中有一个 PNG 文件。创建一个名为 download 的文件夹。在终端窗口中,通过执行以下命令来执行 blob.rb 脚本:

                                 
mkdir download
ruby blob.rb
                              

其输出显示在屏幕截图中。

 

返回主题列表

8. 使用 XML

所有版本的 Oracle 数据库都包含“XML DB”。此试验包括将 XML 数据从 Oracle 返回至 Ruby 的基本操作。您将在本部分中使用以下命令:

DBMS_XMLGEN.getxml (statement)

根据 SELECT 语句从关系数据生成 XML。它返回 CLOB。

要了解 Oracle 的基本 XML 功能,执行以下步骤。

1.

在终端窗口中,通过执行以下命令来执行 xml.rb 脚本:

                                 
ruby xml.rb
                              

其输出显示在屏幕截图中。

 

返回主题列表

9. 使用 ActiveRecord

ActiveRecord 连接业务对象和数据库表以创建持久的域模型,其中的逻辑和数据位于一个包装中。它是对象关系映射 (ORM) 设计模式的一个实现。要在本示例中使用 ActiveRecord,执行以下步骤。

1.

在终端窗口中,通过执行以下命令来执行 activerecord.rb 脚本:

                                 
ruby activerecord.rb
                              

其输出显示在屏幕截图中。

 

返回主题列表

10. Ruby On Rails (RoR):移植和结构

在本教程的其余部分,您将使用以下术语:

Rake 一个用于构建其他 Ruby 程序的 Ruby 程序。在 Rails 中,Rake 用于执行一系列任务,如 db:migrate、db:schema:dump、db:schema:load、db:test:prepare 和 db:test:purge。它在作用域和目的方面与常见的 Linux 设计工具类似。
移植 开发人员可以在 Ruby(而非数据描述语言 (DDL))中创建、修改和删除其数据库对象。
结构 通过创建、编辑、查看和删除 ActiveRecord 类反映的条目,为您的数据提供一个简单接口。结构生成后,它将包含控制器文件(确定您应用程序的用户最终转向哪些页面)和视图文件(呈现应用程序用户将看到的页面)。

要使用移植和结构构建一个 Rails 应用程序,执行以下步骤。

1.

您将创建一个名为 holapp 的非常基本的 Rails 应用程序。在终端窗口中,执行以下命令:

                                 
rails holapp
cd holapp
gedit config/database.yml
                              

 

2.

用以下内容替换 config/database.yml 文件中的 development 部分,然后保存并关闭该文件。

                                 
development:
                                  
adapter: oracle database: orcl11g username: hr
password: hr


3.

现在可以生成 comic 模型。在终端窗口中,执行以下命令:

                                 
ruby script/generate model comic
                              


 

4.

您希望编辑生成的脚本。在终端窗口中,输入以下命令:

                                 
gedit db/migrate/001_create_comics.rb
                              

 

5.

用以下内容替换 self.up 部分,然后保存并关闭该文件。

                                 
 def self.up
    create_table :comics do |t|
          t.column :name,:string
          t.column :description, :string
          t.column :price, :float
    end
  end
                              

 

6.

现在可以对数据库移植进行 rake 操作,以生成目标表。 在终端窗口中,输入以下命令:

                                 
rake db:migrate
                              

 

7.

可以通过以下命令生成 comic 模型的结构

                                 
ruby script/generate scaffold comic
                              

 

8.

Webrick 是用 Ruby 编写的 HTTP 服务器库,它使用 servlet 扩展其功能。使用以下命令启动 Webrick 服务器:

                                 
ruby script/server
                              

 

9.

您可以查看应用程序。打开一个浏览器窗口,输入以下 URL:

                                 
http://localhost:3000/comics
                              

通过单击 New Comic 来确保应用程序正常运行,创建一些记录。

 

返回主题列表

11. RoR:表之间的一对一关系

一对一关系表示表 A 中的一行与表 B 中的零行或一行相关联。要创建表之间具有一对一关系的 Rails 应用程序,执行以下步骤。

1.

打开另一个终端窗口,并执行以下命令:

                               
cd /home/oracle/Work/ruby/holapp
source /etc/bashrc
                            

 

2.

生成 order 和 invoice 模型。在终端窗口中,执行以下命令:

                                 
ruby script/generate model order
ruby script/generate model invoice
                              

 

3.

您希望编辑生成的脚本。在终端窗口中,输入以下命令:

                                 
gedit db/migrate/002_create_orders.rb
                              

 

4.

用以下内容替换 self.up 部分,然后保存并关闭该文件。

                                 
def self.up
                                  
create_table :orders do |t|
t.column :name, :string
t.column :description, :string
end
end

 

5.

您希望编辑生成的脚本。在终端窗口中,输入以下命令:

                                 
gedit db/migrate/003_create_invoices.rb
                                  

 

6.

用以下内容替换 self.up 部分,然后保存并关闭该文件。

                                 
                                   
                                     
def self.up
                                  
  
                                  
create_table :invoices do |t|
                                    
t.column :order_id, :integer
t.column :invoicetype, :string
t.column :description, :string
t.column :amount, :float
end
end

 

7.

现在可以对数据库移植进行 rake 操作,以生成目标表。 在终端窗口中,输入以下命令:

                                 
rake db:migrate
                              

 

8.

您希望编辑生成的脚本。在终端窗口中,输入以下命令:

                                 
gedit app/models/order.rb
                              

 

9.

用以下内容替换文件的内容,然后保存并关闭该文件。

                                 
                                   
class Order < ActiveRecord::Base
                                    
has_one :invoice
end

 

10.

您希望编辑生成的脚本。在终端窗口中,输入以下命令:

                                 
gedit app/models/invoice.rb
                              

 

11.

用以下内容替换文件的内容,然后保存并关闭该文件。

                                 
                                   
class Invoice < ActiveRecord::Base
                                    
belongs_to :order
end

 

12.

可以通过以下命令生成 order 模型的结构:

                                 
ruby script/generate scaffold order
                              

 

13.

您希望编辑生成的 html。在终端窗口中,输入以下命令:

                                 
                                   
gedit app/views/orders/list.rhtml
                                
                              

 

14.

在该文件中,用 Order.columns 替换 Order.content_columns。然后保存并关闭文件。

 

15.

可以通过以下命令生成 invoice 模型的结构:

                                 
ruby script/generate scaffold invoice
                              

 

16 .

您希望编辑生成的 html。在终端窗口中,输入以下命令:

                                 
                                   
gedit app/views/invoices/list.rhtml
                                
                              

 

17.

在该文件中,用 Invoice.columns 替换 Invoice.content_columns。然后保存并关闭文件。

 

18.

您可以查看应用程序。打开一个浏览器窗口,输入以下 URL:

                                 
http://localhost:3000/orders
                              

创建一个新视图。

 

19.

默认情况下,创建结构时由 Rails 生成控制器文件。这些控制器文件具有某些默认操作,如果您希望应用程序以其他方式(而非 Rails 默认生成的方式)进行操作,就需要修改这些默认操作。在终端窗口中,输入以下命令:

                                 
gedit app/controllers/invoices_controller.rb
                                  

 

20.

用以下内容替换 create 部分,然后保存并关闭该文件。

                                 
def create 
   @order = Order.find(:first, :order => "id DESC")
                                  
@invoice = Invoice.new(params[:invoice])
if @invoice.save
if !@order.nil?
@order.invoice = @invoice
end
flash[:notice] = 'Invoice was successfully created.'
redirect_to :action => 'list'
else
render :action => 'new' end
end

 

21.

您可以查看应用程序。打开一个浏览器窗口,输入以下 URL:

                                 
http://localhost:3000/invoices
                              

创建一个新发票。创建发票之后,您会发现它与您最后创建的定单相关联。

 

返回主题列表

12. RoR:表之间的一对多关系

一对多关系表示表 A 中的一行与表 B 中的任意数量的行(可能是零行、一行或多行)相关联。要创建表之间具有一对多关系的 Rails 应用程序,执行以下步骤。

1.

生成 order 和 invoice 模型。在终端窗口中,执行以下命令:

                                 
ruby script/generate model line_item
                              

 

2.

您希望编辑生成的脚本。在终端窗口中,输入以下命令:

                                 
                                   
gedit db/migrate/004_create_line_items.rb
                                  

 

3.

用以下内容替换 self.up 部分,然后保存并关闭该文件。

                                 
def self.up
                                  
create_table :line_items do |t|
t.column :order_id, :integer
t.column :subject, :string
t.column :description, :string
end
end

 

4.

现在可以对数据库移植进行 rake 操作,以生成目标表。 在终端窗口中,输入以下命令:

                                 
rake db:migrate
                              

 

5.

您希望编辑生成的脚本。在终端窗口中,输入以下命令:

                                 
gedit app/models/order.rb
                                  

 

6.

在文件中添加 has_many :line_items 条目,如下所示。然后保存并关闭文件。

                                 
class Order < ActiveRecord::Base
                                  
has_one :invoice

has_many :line_items
end

 

7.

您希望编辑生成的脚本。在终端窗口中,输入以下命令:

                                 
gedit app/models/line_item.rb
                                  

 

8.

用以下内容替换文件的内容,然后保存并关闭该文件。

                                 
                                   
class LineItem< ActiveRecord::Base
                                    
belongs_to :order
end

 

9.

可以通过以下命令生成 line_item 模型的结构:

                                 
ruby script/generate scaffold line_item
                              

 

10.

您希望编辑生成的 html。在终端窗口中,输入以下命令:

                                 
                                   
gedit app/views/line_items/list.rhtml
                                
                              

 

11.

在该文件中,用 LineItem.columns 替换 LineItem.content_columns。然后保存并关闭文件。

 

12.

您可以查看应用程序。打开一个浏览器窗口,输入以下 URL:

                                 
http://localhost:3000/line_items
                              

创建一个新定单。

 

13.

您希望修改控制器文件。在终端窗口中,输入以下命令:

                                 
gedit app/controllers/line_items_controller.rb
                                  

 

14.

用以下内容替换文件的内容,然后保存并关闭该文件。

                                 
def create
                                  
@order = Order.find(:first, :order => "id DESC")
@line_item = LineItem.new(params[:line_item])
if @line_item.save
if !@order.nil?
@order.line_items << @line_item
end
flash[:notice] = 'LineItem was successfully created.'
redirect_to :action => 'list'
else
render :action => 'new'
end
end

 

15.

您可以查看应用程序。打开一个浏览器窗口,输入以下 URL:

                                 
http://localhost:3000/line_items
                              

创建 2 个 line_item。您将发现它们与最后创建的定单相关联。

 

返回主题列表

13. RoR:表之间的多对多关系

多对多关系表示表 A 中任意数量的行与表 B 中任意数量的行相关联。要创建表之间具有多对多关系的 Rails 应用程序,执行以下步骤。

1.

生成 article、author 和 articles_author 的模型。在终端窗口中,执行以下命令:

                                 
ruby script/generate model article
ruby script/generate model author
                                 
ruby script/generate model articles_author
                              

 

2.

您希望编辑生成的脚本。在终端窗口中,输入以下命令:

                                 
                                   
gedit db/migrate/005_create_articles.rb
                                  

 

3.

用以下内容替换 self.up 部分,然后保存并关闭该文件。

                                 
def self.up
                                  
create_table :articles do |t|
t.column :title, :string
t.column :abstract, :string
end
end

 

4.

您希望编辑生成的脚本。在终端窗口中,输入以下命令:

                                 
                                   
gedit db/migrate/006_create_authors.rb
                                  

 

5.

用以下内容替换 self.up 部分,然后保存并关闭该文件。

                                 
def self.up
                                  
create_table :authors do |t|
t.column :name, :string
t.column :vocation, :string
end
end

 

6.

您希望编辑生成的脚本。在终端窗口中,输入以下命令:

                                 
                                   
gedit db/migrate/007_create_articles_authors.rb
                                  

 

7.

用以下内容替换 self.up 部分,然后保存并关闭该文件。

                                 
def self.up
                                  
create_table :articles_authors do |t|
t.column :article_id, :integer
t.column :author_id, :integer
end
end

 

8.

现在可以对数据库移植进行 rake 操作,以生成目标表。 在终端窗口中,输入以下命令:

                                 
rake db:migrate
                              

 

9.

您希望编辑生成的脚本。在终端窗口中,输入以下命令:

                                 
gedit app/models/article.rb
                                  

 

10.

替换文件中的内容,如下所示。然后保存并关闭文件。

                                 
                                   
class Article < ActiveRecord::Base
                                    
has_and_belongs_to_many :authors set_sequence_name "ARTICLES_AUTHORS_SEQ"
end

 

11.

您希望编辑生成的脚本。在终端窗口中,输入以下命令:

                                 
gedit app/models/author.rb
                                  

 

12.

替换文件中的内容,如下所示。然后保存并关闭文件。

                                 
                                   
class Author < ActiveRecord::Base
                                    
has_and_belongs_to_many :articles set_sequence_name "ARTICLES_AUTHORS_SEQ"
end

 

13.

可以通过以下命令生成 article 模型的结构:

                                 
ruby script/generate scaffold article
                              

 

14.

您希望编辑生成的 html。在终端窗口中,输入以下命令:

                                 
                                   
gedit app/views/articles/list.rhtml
                                
                              

 

15.

在该文件中,用 Article.columns 替换 Article.content_columns。然后保存并关闭文件。

 

16.

可以通过以下命令生成 author 模型的结构:

                                 
ruby script/generate scaffold author
                              

 

17.

您希望编辑生成的 html。在终端窗口中,输入以下命令:

                                 
gedit  
                                  
app/views/authors/list.rhtml
                                
                              

 

18.

在该文件中,用 Author.columns 替换 Author.content_columns。然后保存并关闭文件。

 

19.

可以通过以下命令生成 articles_author 模型的结构:

                                 
ruby script/generate scaffold articles_author
                              

 

20.

您希望编辑生成的 html。在终端窗口中,输入以下命令:

                                 
                                   
gedit app/views/articles_authors/list.rhtml
                                
                              

 

21.

在该文件中,用 ArticleAuthor.columns 替换 ArticlesAuthor.content_columns。然后保存并关闭文件。

 

22.

您希望修改控制器文件。在终端窗口中,输入以下命令:

                                 
gedit app/controllers/articles_controller.rb
                                  

 

23.

用以下内容替换文件的内容,然后保存并关闭该文件。

                                 
def create
                                  
@author = Author.find(:first, :order => "id DESC")
@article = Article.new(params[:article])
if @article.save
if !@author.nil?
@author.articles << @article
end
flash[:notice] = 'Article was successfully created.'
redirect_to :action => 'list'
else
render :action => 'new'
end
end

 

24.

在终端窗口中,输入以下命令:

                                 
gedit app/controllers/authors_controller.rb
                                  

 

25.

用以下内容替换文件的内容,然后保存并关闭该文件。

                                 
def create
                                  
@article = Article.find(:first, :order => "id DESC")
@author = Author.new(params[:author])
if @author.save
if !@article.nil?
@article.authors << @author
end
flash[:notice] = 'Author was successfully created.'
redirect_to :action => 'list'
else
render :action => 'new'
end
end

 

26.

您可以查看应用程序。从您的浏览器窗口,输入以下 URL:

                                 
http://localhost:3000/articles
                              

创建一篇文章。

 

27.

然后从您的浏览器窗口,输入以下 URL:

                                 
http://localhost:3000/authors
                              

创建两个作者。

 

28.

现在,您通过输入以下 URL 可以看到作者和文章之间的关联:

                                 
http://localhost:3000/articles_authors
                              

 

29.

返回以下 URL,再创建 3 篇文章

                                 
http://localhost:3000/articles
                              

 

30.

然后输入以下 URL,就会看到您刚创建的文章与最后创建的作者相关联。

                                 
http://localhost:3000/articles_authors
                              

 

返回主题列表

总结

在本教程中,您学习了如何:

 通过 Oracle 安装 Ruby on Rails

使用 Ruby 创建到 Oracle 数据库的连接

 查询数据
 绑定变量
 定义数据类型
 创建并管理事务
 使用 PL/SQL
 使用 LOB 存储和检索图像

使用 XML

使用 ActiveRecord

使用 Rails 创建应用程序

处理 表之间的各种关系

返回主题列表

相关信息

 http://www.rubyonrails.com/
 http://www.ruby-lang.org/
 OTN 上的 Oracle 数据库快捷版
 “Ruby on Rails 之 Oracle 应用”常见问题解答
 OTN 上的 Ruby/Ruby On Rails 论坛

返回主题列表

附录:Ruby 入门

本教程的此部分给出了 Ruby 语言的概述。下面列出了您将遇到的对象。如果您熟悉 Ruby,可以跳过这一部分,向下进行。


变量

$var # 全局变量
@var  # 变量本身的实例
VAR  # 常量
SomeClass::VAR # 某个类中的常量
var 或 _var  # 本地变量


伪变量


self、nil、true、false

FILE # 当前源文件
LINE # 当前行

数组


[1,2,3]

[“dog”, “cat”, “pig”] 等同于 %w(dog cat pig)

[ 1, 'cat', 3.14 ]  

散列


{expr1 => exprA, expr2 => exprB }

hashvar = { 'dog' => 'Frank', 'cat' => 'Sissi', 'donkey' => 'Tim' }
hashvar.length # 3
hashvar['dog']   # "Frank"
hashvar['cow'] = 'Ethan'

范围


expr1 .. expr2 # 包含
expr1 ... expr2 # 不包含最后一个元素

字符串文字


# 双引号中的字符串要进行表达式替换
"remember to escape \" and \\ #{expression_substituted}"
# 不对单引号中的字符串求值
'remember to escape \' and \\ #{expression_not_substituted}'


迭代程序

 

[ 1, 1, 2, 3, 5 ]. each {|val| print val, " " } # 1 1 2 3 5

  3.times do print "Ho!" end # Ho!Ho!Ho!

方法调用

method(args1, arg2)

method(*array) 等同于 method(array_member1, array_member2, …)

操作符

+, -, *, /, %, **, &, |, ^, <<, >>, &&, ||
foo += 5
foo, bar, baz = 1, 2, 3
foo, bar = 1          # foo = 1; bar = nil
foo,*bar = 1, 2, 3          # 等同于 foo = 1; bar = [2, 3](* 多个赋值用于分配到一个数组)


begin 块

# begin 与大写的 BEGIN 不同,含义完全不同
# 如果 expr1 中发生异常, rescue 将执行 expr2。error_type 的匹配由
# kind_of? 执行。 else 子句必须跟在 rescue 后面,如果 expr1 中不发生异常,
# 则执行该子句。即使在传播过程中存在未捕获的异常,退出该块时始终执行 ensure
# 子句。

begin
  expr1..
[ rescue [error_type,..]
  expr2..]..
[ else
  expr3..]
[ ensure
  expr4..]
end




search_engines =
  %w[Google Yahoo MSN].map do |engine|
    "http://www."+ engine.downcase + ".com"
  end


控制结构

falsenil 为假,其他均为真。

if expr [ then]
  expr...
[ elsif expr [ then]
  expr...]...
[ else
  expr...]
end

unless expr [ then]
  expr...
[ else
  expr...]
end

expr1 if expr2          # 如果 expr2 为 true,则执行 expr1
expr1 unless expr2   # 如果 expr2 为 false,则执行 expr1

# 通过 === 操作符比较大小写
case expr
[ when expr [, expr]...[ then]
  expr..]..
[ else
  expr..]
end

while expr [ do]
  #代码位置
end

until expr [ do]
  #代码位置
end

expr1 while expr2              # 当 expr2 为 true 时,继续求 expr1 的值。
expr1 untill expr2              # 对 expr1 求值,直到 expr2 为 true
begin expr1 until expr2     # 至少对 expr1 求值 1 次,直至 expr2 为 true

for lhs... in expr [ do]
  expr..
end

# 有 2 个可在循环体内使用的特殊关键字:
next      #跳到最内层循环的下一个迭代

redo    #重新开始最内层循环的当前迭代,而无需检查
           #循环条件

返回主题列表

附录:如何使用 Rails 移植修改数据库表

在 Rails 中,如果您希望在“ comics”表中添加“ t.column :price, :float”列,执行以下步骤:

1.

现在可以生成 comic 模型。在终端窗口中,执行以下命令:

                                 
ruby script/generate migration add_columns
                              

 

2.

您希望编辑生成的脚本。在终端窗口中,输入以下命令:

                                 
gedit db/migrate/008_add_columns.rb
                                  

 

3.

用以下内容替换 self.up 部分,然后保存并关闭该文件。

                                 
 def self.up
     add_column :comics, :author, :string
  end
                              

 

4.

现在可以对数据库移植进行 rake 操作,以生成目标表。 在终端窗口中,输入以下命令:

                                 
rake db:migrate
                              

注:要删除某列,我们可以在 self.up 方法中添加一行(如“remove_column :comics, :price”);要重命名某列,我们可以在 self.up 方法中添加一行(如“rename_column :comics, :price, :new_price”);要更改某列,我们可以在 self.up 方法中添加一行(如“change_column :comics, :price, :integer”)。
而且,我们可以通过执行“rake db:migrate VERSION=xx”命令来回滚移植操作,其中 xx 是您希望回滚到的版本。

 

返回主题列表

附录:通过 Oracle 安装 Ruby on Rails

本教程的此部分向您介绍如何安装 Oracle 即时客户端、Ruby、Ruby/OCI8、RubyGems 和 Rails,它们是您通过 Oracle 数据库运行 Ruby on Rails 应用程序时所必需的。

1.

OTN 下载 Oracle 即时客户端。打开一个终端窗口,执行以下命令:

                                 
su
<password to root is oracle>
                              

 

2.

Oracle 即时客户端是一个软件,它允许您运行应用程序,而无需安装标准的 Oracle 客户端或拥有 ORACLE_HOME。要安装 Oracle 即时客户端,运行以下命令。

                                 
rpm -ivh oracle-instantclient-basic-10.2.0.3-1.i386.rpm
rpm -ivh oracle-instantclient-devel-10.2.0.3-1.i386.rpm
                              

 

3.

您需要将 libclntsh.so.10.1 所在的目录添加到环境变量 LD_LIBRARY_PATH 指明的库搜索路径。输入以下命令,更新您的 bash 配置文件。

                                 
gedit /etc/bashrc
                              

 

4.

将下面几行添加到 /etc/bashrc 文件末尾,保存该文件并关闭编辑器。

                                 
                                   
                                     
source /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/oracle_env.sh
export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client/lib:$LD_LIBRARY_PATH
                                  
                                
                              

 

5.

通过执行以下命令来执行 oracle_env.sh 脚本:

                                 
                                   
                                     
source /etc/bashrc
                                  
                                
                              

 

6.

要安装 Ruby,执行以下步骤:

                                 
tar -xzvf ruby-1.8.6.tar.gz
cd ruby-1.8.6
./configure
make
make install 
                              

 

7.

RubyGems 是用于发布和管理第三方库的 Ruby 标准。要安装 RubyGems,执行以下步骤:

                                 
                                   
cd ..
tar -xzvf rubygems-0.9.4.tar.gz
cd rubygems-0.9.4
ruby setup.rb
                                
                              

 

8.

Ruby/OCI8 是一种允许 Oracle 使用 OCI8 API 的 ruby 接口。要安装 Ruby/OCI8,运行以下命令:

                                 
                                   
                                     
cd ..
tar -xzvf ruby-oci8-0.1.16.tar.gz
cd ruby-oci8-0.1.16
ruby setup.rb config --with-instant-client
ruby setup.rp setup
ruby setup.rb install
                                  
                                
                              

 

9.

Ruby DBI 模块为 Ruby 脚本提供了一个与数据库无关的接口,与 Perl DBI 模块类似。要安装 Ruby/DBI,运行以下命令:

                                 
                                   
                                     
                                       
cd ..
tar -xzvf dbi-0.1.1.tar.gz
                                    
cd ruby-dbi
ruby setup.rb config --with=dbi
ruby setup.rp setup
ruby setup.rb install
                                  
                                
                              

 

10.

要本地安装 Rails 及其依赖项,运行以下命令:

                                 
                                   
                                     
                                       
cd ..
gem install activesupport-1.4.2.gem
gem install actionpack-1.13.3.gem
gem install active record-1.15.3.gem
gem install actionwebservice-1.2.3.gem
gem install rake-0.7.3.gem
gem install actionmailer-1.3.3.gem
gem install rails-1.2.3.gem
                                    
                                  
                                
                              

如果您可以通过 http://gems.robyforge.org 访问远程 gems,就可以通过运行以下命令远程安装 rails 及其依赖项。这种方法更加便利,因为您不必手动下载 gem 文件。

gem install rails --include-dependencies

 

返回主题列表

 将鼠标置于该图标上可以隐藏所有的屏幕截图。

 

Left Curve
热门下载
Right Curve
Left Curve
更多融合中间件下载
Right Curve