O/R マッパ(Active Record) を使ってみる

Ruby で O/R マッパを使って RDBMS を操作したいです。

Ruby on Rails に付属してくる O/R マッパの Active Record を使ってみます。Rails は元々インストールしていたので、そこから Active Record 単体で使ってみます。

mysql に、

+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned |      | PRI | NULL    | auto_increment |
| url         | varchar(255)     | YES  |     | NULL    |                |
| title       | varchar(255)     | YES  |     | NULL    |                |
| description | text             | YES  |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+

というテーブルがあります。このテーブルは Active Record を使うつもりで設計したものなので、auto_increment な id カラムを持ち、テーブル名は "items" と複数形にしてあります。

#!/usr/local/bin/ruby

require 'rubygems'
require 'active_record'

class Item < ActiveRecord::Base
end

ActiveRecord::Base.establish_connection(
  :adapter  => 'mysql',
  :host     => 'localhost',
  :username => 'rubyo',
  :password => '',
  :database => 'bookmark'
)

とりあえずこれで、Active Record で bookmark データベースに接続して item テーブルを操作することができます。最初 require 'active_record' とだけ書いていて、ライブラリが見つからなくて少しはまりました。rubygem を使ってインストールしたライブラリを使うには require 'rubygems' も併記しておかないといけないようです。

手始めに、

#!/usr/local/bin/ruby

require 'rubygems'
require 'active_record'

class Item < ActiveRecord::Base
end

ActiveRecord::Base.establish_connection(
  :adapter  => 'mysql',
  :host     => 'localhost',
  :username => 'rubyo',
  :password => '',
  :database => 'bookmark'
)

Item.create(
  :url         => 'http://d.hatena.ne.jp/rubyo/',
  :title       => 'るびおの日記',
  :description => 'るびおのRuby勉強日記'
);

Item.create(
  :url         => 'http://d.hatena.ne.jp/rubyco/',
  :title       => 'るびこの日記',
  :description => 'るびこのRuby勉強日記'
);

Item.create(
  :url         => 'http://b.hatena.ne.jp/rubyo/',
  :title       => 'るびおのブックマーク',
  :description => 'るびおのRuby関連ブックマーク'
);

として items に三つのレコードを追加しました。

次に items テーブルに検索系のクエリを投げてみました。

Item.find(:all, :limit => 2, :order => "id desc").each do |item|
  puts item.url
end

Item.find(:all, :conditions => "url like '%ruby%'").each do |item|
  puts item.url
end

puts Item.count
puts Item.count(['title = ?', 'るびおの日記'])

Item.find_all_by_title('るびおの日記').each do |item|
  puts item.url
end

この結果は、

http://b.hatena.ne.jp/rubyo/
http://d.hatena.ne.jp/rubyco/
http://d.hatena.ne.jp/rubyo/
http://d.hatena.ne.jp/rubyco/
http://b.hatena.ne.jp/rubyo/
3
1
http://d.hatena.ne.jp/rubyo/

となりました。Active Record はとても直感的で分かりやすいと思いました。Active Record について詳しくは Rails 本の P.207 から解説がありました。しっかり読んで理解したいと思います。

RailsによるアジャイルWebアプリケーション開発

RailsによるアジャイルWebアプリケーション開発