ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

ActiveRecordを単体で動かす。

とりあえず、以下のようなコードを書いて実行してみました。

class Item < ActiveRecord::Base
end

すると、こんなエラーが出ました。

C:\work\rubyproject\test>ruby test.rb
test2.rb:1: uninitialized constant ActiveRecord (NameError)

まあ、これは想定の範囲内ってことで。ライブラリの依存関係を解消してないために出ているエラーっぽいです。じゃあ、Railsの中ではどうやってライブラリ解決してるの?っていうことで、Railsの生成物の中からrequireが含まれる部分をgrepしてみました。すると、config/boot.rbっての見つかりました。

unless defined?(RAILS_ROOT)
  root_path = File.join(File.dirname(__FILE__), '..')
  unless RUBY_PLATFORM =~ /mswin32/
    require 'pathname'
    root_path = Pathname.new(root_path).cleanpath(true).to_s
  end
  RAILS_ROOT = root_path
end

if File.directory?("#{RAILS_ROOT}/vendor/rails")
  require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
else
  require 'rubygems'
  require 'initializer'
end

Rails::Initializer.run(:set_load_path)

このboot.rbを取り込めればよかったんでしょうけど、いまいちどうやるか不明だったので、

  require 'rubygems'
  require 'initializer'

の二行を取り込んでみたところ、普通に動いてしまいました。以下実証コードです。

# 必須ライブラリをインクルード(?)
require 'rubygems'
require 'initializer'

# itemsテーブルへのマッピング
class Item < ActiveRecord::Base
end

# 接続されているかどうかチェック
puts Item.connected?

# mysqlに接続
ActiveRecord::Base.establish_connection(
	:adapter  => "mysql",
	:host     => "localhost",
	:username => "taka",
	:password => "hogehoge",
	:database => "todos"
)

# ID=4のレコードを取得
item = Item.find(4)

# 接続されているかどうかチェック
puts Item.connected?

# ID=4のレコードのid列を表示
puts item["id"]

# 全カラム名を出力
Item.column_names.each do |x|
	puts x
end

そして以下が実行例

C:\work\rubyproject\test>ruby test.rb
false
true
4
id
done
priority
description
due_date
category_id
note_id
private
created_on
updated_on

ActiveRecordは、この単体実行を足がかりに色々試せそうです。しかし、やっぱりWebに最適化されているせいか、起動が遅いなぁ。。