ActiveRecord Without Rails

02 Jun 2009

前几天写了个小程序,帮我选号买彩票。主要是去网上抓取历次的开奖号码,存到数据库,然后再做统计分析。

因为程序很小,所以实在不想把Java这个大胖子叫出来,就简单地在vi下写了几十行的ruby代码。由于要用到数据库,自然想到了ActiveRecord,平时都是在Rails环境下用的,现在却是要让它脱离出来,闹独立。

首先是在mysql中新建数据库:

mysqladmin -uroot create caipiao

接着当然应该是定义database.yml

adapter: mysql
encoding: utf8
database: caipiao
username: root
password:
socket: /var/run/mysqld/mysqld.sock

定义migration,新建db/migrate目录,新建migration文件,注意前面加上数字前缀,001_xxx, 002_yyy,migration文件内容就和rails中的一模一样。

class CreateRedBlueBalls < ActiveRecord::Migration
  def self.up
    create_table :red_blue_balls do |t|
      t.integer :number
    end
  end

  def self.down
    drop_table :red_blue_balls
  end
end

最关键的是Rakefile文件

require 'active_record'
require 'yaml'

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('database.yml')))
end

在environment任务中读取database.yml配置文件,在migrate任务中,根据VERSION定义数据库。

剩下的就是定义好model文件了:

require 'rubygems'
require 'active_record'
require 'yaml'

dbconfig = YAML::load(File.open('database.yml'))
ActiveRecord::Base.establish_connection(dbconfig)

class RedBlueBall < ActiveRecord::Base
  has_many :red_balls
  has_one :blue_ball

  validates_uniqueness_of :number
end

最后你只需要在命令行输入rake即可运行migration,RedBlueBall就可以像在Rails中一样来使用了。

可以看到,Rails的约定帮我们做了很多事情,定义好了Rakefile,所有的model都会自动require相应的gems,读取database.yml配置文件。

Tags 


blog comments powered by Disqus