対象:
JRuby

ActiveRecordを利用する

RubyではおなじみのActiveRecordであるが、JRubyでもactiverecord-jdbc-adapterがあればActiveRecordが利用できる。必要なのはActiveRecord、activerecord-jdbc-adapter、及び接続したいDBのJDBCドライバの3点である。JavaでJDBCを使い慣れた方であれば、JDBCドライバ名やURL等の情報を記述することで簡単にDBアクセスが可能となる。

gemのインストール

まずはActiveRecordのgemをインストールする。この記事執筆時点でのActiveRecordの最新版は3.0.3である。

$ gem install activerecord

企業等、インターネットに接続されていない環境ではこちらを参考にしてActiveRecordのgemをローカルでインストールする。

$ gem install --local activerecord-3.0.3.gem

次にactiverecord-jdbc-adapterのgemをインストールする。この記事執筆時点でのactiverecord-jdbc-adapterの最新版は1.1.0である。インターネットに接続されていない環境の場合は上記のActiveRecordの例を参考にしていただきたい。

$ gem install activerecord-jdbc-adapter

尚、JDBCドライバのjarには予めCLASSPATHを通すか、JRubyインストールディレクトリのlibに置いておく必要がある。因みに、MySQLのJDBCドライバはmysql-connector-java-5.1.12.jarのようなファイル名となる。

ActiveRecordの使い方

以下のスクリプトはMySQLのtestdbデータベースにあるemployeesテーブルにアクセスする例である。ActiveRecordでは記述したクラス名(ここではEmployee)の複数形であるemployeesというテーブルがある前提になっている。また、このテーブルにはidという名前で主キーが存在する必要がある。他にもいくつか決まりがあるのだがここでは割愛する。

require "java"
require "rubygems"
require "active_record"

$KCODE="UTF8" # 日本語が文字化けする場合入れてみよう

ActiveRecord::Base.establish_connection(
  :adapter => "jdbc", # アダプタ名はjdbc
  :driver => "com.mysql.jdbc.Driver", # JDBCドライバ名
  :url => "jdbc:mysql://localhost/testdb", # URL
  :username => "mobile",
  :password => "mobile"
)

class Employee < ActiveRecord::Base
end

#result = Employee.find(:all)
result = Employee.all
result.each do |emp|
  p emp.id
  p emp.name
  p emp.age
  p emp.lastupdate
end

特定のDB専用アダプタ

特定のDBの場合、activerecord-jdbcxxx-adapterのように専用のアダプタが用意されている。例えば、MySQLならばactiverecord-jdbcmysql-adapterを別途インストールするとestablish_connectionメソッドでJDBC特有の記述をしなくても良くなる。

ActiveRecord::Base.establish_connection(
  :adapter => "jdbcmysql", # アダプタ名はjdbcmysql
  :hostname => "localhost", # ホスト名
  :database => "testdb", # データベース名
  :username => "mobile",
  :password => "mobile"
)

ActiveRecordが発行するSQLが見たい

開発時等、ActiveRecordがDBに対してどんなSQLを発行しているのか見たいと思ったことはないだろうか。以下の1行を加えることで標準出力にActiveRecordが生成したSQLが表示される。

ActiveRecord::Base.logger = Logger.new(STDOUT) # SQLを標準出力へ

テーブル名が複数形ではない

ActiveRecordを使う際、対象となるテーブル名はクラス名の複数形でなければならないが、実際の開発現場では既存のテーブルにアクセスしなければならない事も多いだろう。それではActiveRecordは使えないのかと言うとそうでもない。set_table_nameで対象のテーブル名を変更することができる。

class Employee < ActiveRecord::Base
  set_table_name "table_name" # ここに対象のテーブル名を書く
  set_inherit_column # 既存のテーブルにtypeカラムがある場合この1行を書いてみよう
end

また、既存テーブルでActiveRecordを利用しようとして、typeカラムがどうのこうのとのエラーが出たことはないだろうか。ActiveRecordではtypeカラムは特別な意味を持っている。このため、テーブル内に別の意味でtypeカラムがあるとエラーが発生する。これをとりあえず回避するならset_inherit_columnと記述すると良い。

(2010/12/18)

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright(C) 2004-2014 モバイル開発系(K) All rights reserved.
[Home]