ActiveRecord と ActiveSupport を使ってコマンドラインアプリを作る

目の前にはcsvの山がある。これをrdbに突っ込まないといけない。その後railsアプリがそのrdbを使うのである。csvは何種類かあって,素直にテーブルに対応しているわけじゃない。つーことは突っ込むときにActiveRecordを使えればラクじゃろと思った。ARだけじゃなくて,便利なメソッドがたくさん入っているActiveSupportも使いたい。とりあえず何も考えずにスクリプトを書いてみる。

require 'rubygems'
require_gem 'activerecord'

とすればARは(ActiveSupportも)使えるようになる。でもモデルはrailsで作ったモデルをそのまま使いたい。同じ定義をコピペしてもいいんだけど,バージョンがずれたりすると困るし。

require 'rubygems'
require_gem 'activerecord'
$LOAD_PATH.push('/path/to/models')

こうやってモデルのディレクトリを$LOAD_PATHに入れておくだけでいい。これはActiveSupportの機能で,$LOAD_PATHにあるクラスは自動的に使えるようになる(ファイル名==クラス名である必要がある)。DBに接続するところは自前でやらないといけないけど,ARにメソッドが用意されているので簡単。

require 'rubygems'
require_gem 'activerecord'
$LOAD_PATH.push('/path/to/models')

ActiveRecord::Base.establish_connection(
  :adapter => 'hoge_db',
  :database => 'hoge_development',
  :username => 'hoge_user',
  :password => 'hoge_pw',
  :host =>'localhost'
)

いや待て。database.ymlを見てほしいな。これも簡単。

require 'rubygems'
require_gem 'activerecord'
$LOAD_PATH.push('/path/to/models')

config = YAML.load_file('/path/to/config/database.yml')
ActiveRecord::Base.establish_connection(
  configl['development']
)

こんな感じで,コマンドラインからARを使うスクリプトは簡単にできる。面倒な外部参照とかARに任せられるのは嬉しい。
で次にacts_as_searchableを使おうと思った。全文検索が必要だから,rdbに突っ込むときにインデックスも作ってしまえばいいだろうという考え。ところが,acts_as_searchableをインストールして,モデルに記述してからAR#saveするとエラーになる。acts_as_searchableはHyper Estraierとやりとりするときの設定をdatabase.ymlに記述するのだけど,その設定(上記のconfig)が渡っていない。普段はrailsが渡してくれるのだけど,今は自前で設定しているため渡らないように思われる。が,渡し方が分からない。いまここで挫折中。
「script/consoleを使う」案をid:kdmsnrさんに教えてもらった。railsアプリのscriptディレクトリの中にconsoleというirbrails向けに拡張したツールが入っている。こいつは起動時にrails環境を読み込むので,ここにスクリプトを読み込ませればいい。初期化は全部やってくれるので,上に書いたようなDB接続なども不要になる。

ruby script/console < hoge.rb

こんな感じ。逆にcosoleの初期化時に走るコードをhoge.rbにコピペしてもいいだろう。
id:kakutaniさんに教えてもらったのはscript/runnerってやつ。こいつは引数をいきなりevalしちゃうので,スクリプトファイルを実行させようと思うとちょっと妙なことをしないといけない。そのかわりscript/consoleのような余計な機能がない。こんな感じでやってみたがもっといい方法があるのだろうか。

ruby runner 'eval(IO.readlines("hoge.rb").join)'

【今回の参考図書】

Ruby on Rails入門優しいRailsの育て方

Ruby on Rails入門優しいRailsの育て方