这是来自O’Reilly Network的一篇关于如何如何使用Ruby及ActiveRecord编写控制台程序的教程,文章通过一个例子程序EarGTD演示了编写控制台程序需要注意的方方面面(文件布局,数据库连接等等),作者是Gregory Brown,你可以在这里找到原文 ,这是第二部分。
没有生成器
使用Rails的好处是它可以帮你生成程序的基本框架,你也不需要关心目录结构,但是现在我们打算写一个独立的Ruby程序,因此我们必须自己考虑这些问题了,不过也不用太担心,这不是很复杂。
目录结构
让我们先来看看目录结构吧,EarGTD的目录结构如下:
ear_gtd.db
test_ear_gtd.db
lib/
ear_gtd.rb
test/
test_ear_gtd.rb
Rakefile
earGTD
作为一个示例程序来说,这些文件已经足够了,当然,如果一般的发布版本会有一个bin目录存放可执行脚本,但是为了简单起见,我们先忽略这个。
如果你看过一些Ruby项目的源码,这样的结构在Ruby项目中相当常见,一般lib目录存放你的库文件,data目录存放你的数据文件,test目录存放你的单元测示例。
当然,这个并不是强制的,你也可以将你所有的代码(包括单元测试等等)都放到一个文件中,但是,有些工具可能需要依赖这样的目录结构才能够正常工作。
连接数据库
在Rails中,你可以通过config/database.yml来配置你的数据库连接,但是现在我们需要单独使用ActiveRecord,所以我们还需要做些额外工作。
下面这段代码演示了如何将database.yml文件中的配置信息转换为Ruby代码:
development:
adapter: sqlite3
database: db/my_database.sqlite3
ActiveRecord::Base.establish_connection(
:adapter => :sqlite3,
:database => "db/my_database.sqlite3"
)
执行了这段代码后,你就可以通过ActiveRecord来访问你的Model了。
不过,尽管这样也可以工作,但我还是建议你像Rails那样将数据库的连接信息保存到一个YML文件中,事实上,这很简单。
使用YAML库
让我们假设现在你也有一个目录叫做conifg,并且也存放了一个database.yml文件:
development:
adapter: sqlite3
database: db/my_database.sqlite3
那么现在你可以通过下面这段代码来建立你的数据库连接:
require "yaml"
ActiveRecord::Base.establish_connection(YAML.load_file("config/database.yml"))
YAML.load_file会返回一个Hash,因此你可以直接用它作为参数来建立连接。
数据大纲定义
对于我们这个简单的应用来说,没有什么必要使用migration,但是也应该尽量避免直接操作SQL语句,我们可以使用ActiveRecord:Schema来避免直接和SQL打交道。
EarGTD的数据库相当简单:
ActiveRecord::Schema.define do
create_table :tasks do |t|
t.column :description, :string
t.column :status, :string
t.column :context_id, :integer
t.column :project_id, :integer
end
create_table :contexts do |t|
t.column :name, :string
end
create_table :projects do |t|
t.column :name, :string
end
end
现在我们的数据库就搞定了,下面该定义Model了,虽然没有了Rails,但是Model的定义跟在Rails中一模一样,我们将在下一讲中定义我们的Model。
