单独使用ActiveRecord
需要在应用根目录demo/下的app.rb文件中写入:
require 'active_record'
require 'sqlite3'
ActiveRecord::Base.establish_connection(
:adapter=>'sqlite3',
:database=>'data.sqlite3',
:pool=>5,
:timeout=>5000
)
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.integer :age
end
end
end
CreateUsers.new.change
class User < ActiveRecord::Base
end
User.create name:"Jack",age:12
首先,使用ActiveRecord::Base.establish_connection建立连接,然后定义数据表迁移,再使迁移生效建立数据表,最后就可以像在rails中一样定义model,然后正常使用ActiveRecord了。
代码可以正常工作了,但可以做的工作还有很多,因为这段代码实在是不美观。
像样的结构
大杂烩式的代码文件总是不美的,上面代码中包含了数据库连接,表创建,model定义和实际的应用代码四部分,这么多功能各异的部件还是分开好。首先创建demo/db目录,在这个目录下放置所有数据库连接的定义;创建demo/models目录,在下面放置model定义文件。demo/app.rb文件位置不变。
model定义
model定义文件demo/user.rb的内容就是将上面的user类定义复制过来即可。
class User < ActiveRecord::Base
end
ActiveRecord配置
新建demo/db/connection.rb文件,该文件里设置数据库连接:
require 'active_record'
require 'yaml'
dbconfig = YAML::load(File.open('db/database.yml'))
ActiveRecord::Base.establish_connection(dbconfig)
这里模仿rails使用了yaml来配置连接,该文件也在demo/db目录下,内容为:
adapter: sqlite3
database: data.sqlite3
pool: 5
timeout: 5000
现在的demo/app.rb清爽多了:
require File.expand_path('../db/connection',__FILE__)
Dir[File.expand_path('../models',__FILE__)+'/*.rb'].each{|f| require f }
User.create name:"Jack",age:12
数据表迁移
现在还有一个问题,我也想像rails中那样利用rake来迁移数据表定义。参考我前一篇博客
Rake就可以轻松写出数据迁移的rakefile。在demo/根目录下创建rakefile文件:
require 'active_record'
require 'yaml'
require 'logger'
task :default => :migrate
task :migrate => :environment do
ActiveRecord::Migrator.migrate('db/migrate', ENV["VERSION"] ? ENV["VERSION"].to_i : nil )
end
task :environment do
ActiveRecord::Base.establish_connection(YAML::load(File.open('db/database.yml')))
ActiveRecord::Base.logger = Logger.new(File.open('db/database.log', 'a'))
end
只要在终端中执行rake命令就可能完成数据迁移:
$ rake
== CreateUsers: migrating ====================================================
-- create_table(:users)
-> 0.0020s
== CreateUsers: migrated (0.0040s) ===========================================
实际上现在还无法得出这样的输出,因为还没有编写迁移代码文件。那么迁移文件写在哪儿呢?在demo/db/migrate/目录中专门用来放置数据迁移代码,比如现在我们在该目录下新建一个迁移文件001_create_users.rb,写入迁移代码:
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.integer :age
end
end
end
现在执行rake命令才能得出上面给出的正确输出。
最后给出示例应用的最终目录结构: