在 JRuby 中使用 ActiveRecord
使用 ActiveRecord 需要做的第一件事是连接至 Derby。在文本编辑器中打开一个新文件,并将其命名为 activeRecord.rb。输入清单 9 中所示的代码。
清单9:用 ActiveRecord 连接至 Derby
require "rubygems"
require_gem "activerecord"
require 'jdbc_adapter'
ActiveRecord::Base.establish_connection(:adapter => "jdbc" ,
:driver => "org.apache.derby.jdbc.EmbeddedDriver" ,
:url => "jdbc:derby:JRubyDB;create=true" )
ActiveRecord::Base.remove_connection()
|
让我们一次查看一行代码:
让我们一次查看一行代码:
◆require "rubygems" —— 第一行将导入一组工具,这组工具将允许您把 gem 导入到代码中。需要使用这段代码才能引入 activerecord gem。
◆require_gem "activerecord" —— 第二行将导入 ActiveRecord gem。
◆require 'jdbc_adapter' —— 第三行将引入 ActiveRecord-JDBC 适配器。
◆ActiveRecord::Base.establish_connection(:adapter => "jdbc" , :driver =>"org.apache.derby.jdbc.EmbeddedDriver" , :url => "jdbc:derby:JRubyDB;create=true" ) —— 这行代码将把 ActiveRecord 连接至 Derby。establish_connection 方法将获取实参的变量列表,在 JDBC 连接的情况下包括适配器名称、驱动程序和 JDBC URL。适配器名称用于告诉 ActiveRecord 查找 JDBC 适配器并使用它,这点与 MySQL 或 Oracle 正好相反。驱动程序和 URL 参数都是 JDBC 建立连接所需的数据。如果使用了一个 ActiveRecord 的内置适配器,则需要在 establish_connection 方法中使用不同的参数。
◆ActiveRecord::Base.remove_connection() —— 最后一行用于断开连接。在此情况下,这样做实在没必要,因为脚本已退出,JVM 也已退出,因此连接将被破坏 —— 但这是个很好的习惯。
如果按照原样运行此脚本,则不会按照预期得到输出。除了建立连接并随后断开连接之外,您没有对 ActiveRecord 执行任何操作,因此这也合情合理。
使用 ActiveRecord 与数据进行交互
此部分将说明用 ActiveRecord 如何检索 Derby 中的数据和将输入插入 Derby 以及如何使用 ActiveRecord 事务。
使用 ActiveRecord 从 Derby 中检索数据
下一步是从数据库中提取所有雇员,从这里事情将开始变得有趣起来。将清单 10 中所示的代码行添加到脚本的 establish_connection 调用和 remove_connection 调用之间。
清单10:从数据库中提取所有雇员
class Employee < ActiveRecord::Base
end
emps = Employee.find(:all)
emps.each do |emp|
puts emp.name
end
|
如果现在运行脚本,将获得一张所有雇员的清单,如下所示:
Fred Smith
John Doe
Jane Jones
Sam Smiles
Julie Morgan
Wilma Fonda
Danielle Jamison
Michele Cannon
Lance Hanniford
Eliot Rinaggio
James Cotton
刚刚发生了什么事?让我们来看一看添加的代码:
◆前两行声明了一个名为 Employee 的类,该类是从 ActiveRecord::Base 扩展而来。
◆find 方法是 ActiveRecord::Base 附带的一种方法并且为您提供一种灵活搜索所需雇员的方法。它将返回一个匹配指定条件的雇员数组 —— 在本例中为所有雇员。
◆each 方法是 Ruby 实现迭代器范式的方法。正如您在阅读时所期望的,对于返回的每个雇员,其名称都被输出到控制台。
ActiveRecord 如何知道要连接到哪张表,或者如何知道有一个关于雇员的名称字段?这是 ActiveRecord 魔术的一部分。它使用逻辑默认值来猜测哪一张是数据库表。由于将类命名为了 Employee,因此 ActiveRecord 将默认查找名为 employees 的表。同样地,它将使用某种形式的反射来获得列名并使用这些列名作为对象的属性,除非您告诉它不这样做。
要查看 ActiveRecord 能够实现的更多功能,通过将条件添加到 find 方法中,使用本教程中较早时候提到的 PreparedStatement 语句,来添加要使用的限制,以便只返回姓名开头为 J 的雇员。要执行此操作,请将 Employee.find 行更改为 emps = Employee.find(:all, :conditions => "name like 'J%'")。
这将告诉 ActiveRecord 查找满足条件的所有记录。ActiveRecord 有一组强大的功能,可以帮助您缩小查找对象的范围。 |