2007年9月30日日曜日

Ruby: ambitionを試す

Rubyのブロックで条件指定するとSQLを作成するAmbitionなるものを試してみました。
とりあえずActiveRecordだけあればよさげですが、今回はRails一式をインストールしてから試してみました。
使用するデータベースはMySQLです。

まずはAmbitionのインストール

$ sudo gem install ambition -y


次にMySQLにお試しテーブルを作成します。

$ mysql -u myadmin -p sampledb
mysql> \. pet.sql
...
mysql>exit;
Bye

$ cat pet.sql
create table pets(
id integer not null auto_increment,
name varchar(20),
age smallint,
primary key(id)
);

insert into pets(name, age)values('Hanako', 13);
insert into pets(name, age)values('Wan-taro', 15);
insert into pets(name, age)values('Pochi', 3);
insert into pets(name, age)values('Shiro', 8);
insert into pets(name, age)values('Tama', 4);
insert into pets(name, age)values('Tora', 2);


さっそくAmbitionを試しましょう

require 'rubygems'
require 'active_record'
require 'ambition'

ActiveRecord::Base.establish_connection(
:adapter => 'mysql',
:database => 'sampledb',
:host => 'localhost',
:username => 'myadmin',
:password => 'xxxxxxx'
)



# petテーブルに対応するクラス テーブルが複数形なのに対してクラスは単数形
class Pet < ActiveRecord::Base
def to_s
return "name:#{name} age:#{age} "
end
end

# Rubyの条件でSQLが作成されます
puts Pet.select{|p| p.name == 'Hanako'}
#SELECT * FROM pets WHERE pets.`name` = 'Hanako'

puts Pet.select{|p| p.name =~ '%ako%'}
#SELECT * FROM pets WHERE pets.`name` LIKE '%ako%'

# MySQLは正規表現も使えるんですね
puts Pet.select{|p| p.name =~ /ako/}
#SELECT * FROM pets WHERE pets.`name` REGEXP 'ako'

puts Pet.sort_by{|p| [p.age, p.name]}
#SELECT * FROM pets ORDER BY pets.age, pets.name

# テーブルにアクセスし年齢でソートして画面に出力
Pet.sort_by{|p| p.age}.each{|p| puts p}
#name:Mie age:2
#name:Pochi age:3
#name:Tama age:4
#name:Shiro age:8
#name:Hanako age:13
#name:Wan-taro age:15

# データベースに接続されていなくても構わないようです
pets = [Pet.new(:name => 'Foo', :age => 2),
    Pet.new(:name =>'Bar', :age => 11)],
Pet.new(:name => 'Baz', :age => 7))]

Pet.ambition_source = pets
# 年齢を降順にソート
Pet.sort_by{|p| -p.age}.each{|p| puts p}
#name:Bar age:11
#name:Baz age:7
#name:Foo age:2


# ambition_source を nilに戻すと再びデータベースへアクセスします
Pet.ambition_source = nil
Pet.sort_by{|p| p.age}.each{|p| puts p}
#name:Mie age:2
#name:Pochi age:3
#name:Tama age:4
#name:Shiro age:8
#name:Hanako age:13
#name:Wan-taro age:15


なんかいい感じですね!!JRubyで動作しないのが残念です。

0 件のコメント: