本を読む

読書やコンピュータなどに関するメモ

Bash on Railsを作る(3) O/Rマッパーもどきの説明

 Bash on Railsを作るネタ企画です。

 第2回で、ActiveRecotdふうのO/Rマッパーもどきを紹介しました。が、実行例だけだったので、今回は説明を入れます。

第1回の補足

 第1回で説明し忘れていたことがありました。

 第1回で定義したテーブルには、自分で定義したカラムのほか、自動的に「id」というカラムも定義されています。idには、ユニークな番号が自動的に割り振られます。

対話型実行環境を起動する

 まず、対話型実行環境のscript/consoleを起動します。すると、「console:(数字)> 」というプロンプトが表示されます

% script/console
console:1>

 実体は、ライブラリや設定を読み込んでbashを起動しているだけです。そのため、以下のコマンドは、自分で言語を実装したりしているわけではなくて、本当にbashで実行されるコマンドです。

モデルのクラスを定義する

 SHar::baseクラスのextendメソッドを使って、派生クラスとしてmembersクラスを作ります。

console:1> SHar::base.extend members

 membersというクラス名は、設定されたテーブル名と同じにします。ちなみに、extendというメソッド名はJavaScriptのprototype.jsを意識しました。

レコードのオブジェクトを作ってINSERTする

 では、memberクラスのインスタンスとしてレコードのオブジェクトを作ってみましょう。membersのクラスメソッドnewを使います。

console:2> members.new emasaka

 この例では、emasakaという名前のオブジェクトが作られます。emasakaオブジェクトは、membersテーブルと同名のインスタンス変数と、membersクラスで定義されたインスタンスメソッドを持ちます。

 さっそく、name、mailaddress、commentという、3つのインスタンス変数に値を設定してみます。

console:3> emasaka_name='emasaka'
console:4> emasaka_mailaddress='emasaka@example.jp'
console:5> emasaka_comment='Hello'

 あとは、emasakaオブジェクトのsaveメソッドを呼ぶと、データベースに対してINSERTされます。

console:6> emasaka.save

2つ目のレコードのオブジェクトを作ってINSERTする

 2つ目のレコードも作ってINSERTしてみます。oreというオブジェクトを、まったく同じ方法で作って処理します。

console:7> members.new ore
console:8> ore_name='oreore'
console:9> ore_mailaddress='oreore@example.jp'
console:10> ore.save

すべてのレコードを読み出す

 レコードを2つ作成したところで、データベースから読み出してみましょう。

 まず、membersのクラスメソッドfindを使って、テーブルから全件を読み出します。

console:11> members.find members_list :all

 これで、members_listという変数に、結果のリストが格納されます。

 members_listに格納される値は、bashのfor文で1つずつ取り出せます。ただし、それだけではただの文字列です。そこで、受け取った変数を、membersのblessメソッドに引数として渡すと、その変数がmembersクラスのオブジェクトに変身します。blessという名前は、Perlを意識したものです。

 あとは、そのオブジェクトのインスタンス変数にアクセスできます。

console:12> for person in $members_list; do
> members.bless person
> echo "name=$person_name, address=$person_mailaddress"
> done

 ちなみに、上のリストで行頭の「> 」はbashのプロンプトです。

 実行すると、以下のとおり表示されます。

name=emasaka, address=emasaka@example.jp
name=oreore, address=oreore@example.jp

特定のレコードを読み出す

 続いて、条件をつけてレコードを読み出してみましょう。findメソッドの引数で、:allのかわりに:conditions=(条件)を指定します。条件は、SQLのWHERE節をそのまま書きます。

console:13> members.find emasaka :conditions="name = 'emasaka'"

 結果が1レコードとわかっている場合は、そのままblessにかけてかまいません。blessは、リストの最初の項目以外を無視してオブジェクトに変える仕様になっています。

console:14> members.bless emasaka

 このオブジェクトのメンバー変数にアクセスすると、レコードが読み込まれていることがわかります。

console:15> echo "name=$emasaka_name, address=$emasaka_mailaddress"
name=emasaka, address=emasaka@example.jp

オブジェクトの値を変更してレコードを更新する

 上で読み込んだオブジェクトを使い、インスタンス変数の値を変更して、レコードを更新してみましょう。更新の場合も、新規作成した場合と同じくsaveメソッドを使います。

console:16> emasaka_mailaddress='updated@example.jp'
console:17> emasaka.save

 再び全件表示してみると、データベース上の値が更新されていることがわかります。

console:18> members.find members_list :all
console:19> for person in $members_list; do
> members.bless person
> echo "name=$person_name, address=$person_mailaddress"
> done
name=emasaka, address=updated@example.jp
name=oreore, address=oreore@example.jp

レコードを削除する

 テーブルからレコードを削除するには、deleteメソッドにレコードのidを与えます。

console:20> members.delete 1

 ここでは話を簡単にするため、最初のレコードのidが「1」であることを前提にしています。実際に値を調べる場合は、削除するレコードを読み出してオブジェクトを作ってから、オブジェクトのインスタンス変数idの値を参照します。

 再び全件表示してみると、レコードが1つ削除されていることがわかります。

console:21> members.find members_list :all
console:22> for person in $members_list; domembers.bless person
> echo "name=$person_name, address=$person_mailaddress"
> done
name=oreore, address=oreore@example.jp

対話型実行環境を終了する

 終了は、bashですので、exitかCtrl-Dです。

console:23> exit
exit
%

まとめ

 Ruby on Railsが使うActiveRecordにできるだけ似せて、O/Rマッパーもどきを作ってみました。オブジェクト指向ふうの処理をbashでどう実装しているかは、インスタンス変数の扱いあたりから透けてみえるかもしれません。そのへんは、追って。

注意:Bash on Railsは、実用性を無視したパロディソフトです。誤解のないようお願いします。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/345-144e4129

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad