とりあえず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 件のコメント:
コメントを投稿