RingoJSのチュートリアルをやってみる 3日め

久しぶりにRingoJSのチュートリアルの続きをやってみます。今日はMVCの「M」にあたるモデル部分の実装がテーマです。

Tutorial - RingoJS

Configuring a Store

モデルの実装は「model.js」という名前のファイルに書くのが慣習になっているようです。

// model.js
var filestore = require('ringo/storage/filestore');
var storePath = './db';
var store = new filestore.Store(storePath);

1行目で「filestore」ライブラリを読み込んで、3行目でfileStore.Storeオブジェクトを生成しています。newとか使うんですね。JavaScriptなのにオブジェクト指向プログラミングっぽいです。
ちなみに、「ringo/storage」の下には以下のファイルが並んでいました。ファイルストアの他にgoogleストアとメモリストアがあるみたいです。googleストアはGoogle App Engineのデータストアなんだろうけど、普通のRDBストアはないのかな?よくわかりません。

filestore.js
googlestore.js
memstore.js
querysupport.js
storeutils.js
エンティティを定義する

Storeオブジェクトは「defineEntity」というメソッドを持っています。ソースコードの中でエンティティを定義するわけですね。

// model.js
var filestore = require('ringo/storage/filestore');
var storePath = './db';
var store = new filestore.Store(storePath);

exports.Post = store.defineEntity('Post');
exports.Comment = store.defineEntity('Comment');

エンティティを定義すると同時にエクスポートしています。「Post」と「Comment」をエクスポートしているので、この2つは他のモジュールから利用できるようになっています。

エンティティを使ってみる

せっかくエンティティを定義したのでシェルから呼び出して使ってみましょう。

$ ringo
>> var model = require('model');
>> var post = new model.Post();
>> post.title = 'たいふうが じょうりくしたよ';
たいふうが じょうりくしたよ
>> post.body = '今日は台風が来て雨と風がひどかったのでおうちでおとなしくしていました。';
今日は台風が来て雨と風がひどかったのでおうちでおとなしくしていました。
>> post.save();

model.jsからrequireしたPostのオブジェクトを生成して、プロパティを適当にセットして、save()メソッドを呼ぶと保存できました。
ファイルストアなので、ファイルに書き出されます。

$ cat db/Post/1
{"title":"たいふうが じょうりくしたよ","body":"今日は台風が来て雨と風がひどかったのでお風がひどかったのでおうちでおとなしくしていました。"}

「1」というファイル名で中身はjson形式で保存されていました。なるほど。


get()メソッドで、IDを指定してエンティティをロードすることができます。filestoreの場合、ファイル名がIDになるようです。

>> var model = require('model');
>> var post = model.Post.get(1)
>> post.title
たいふうが じょうりくしたよ
>> post.body
今日は台風が来て雨と風がひどかったのでお風がひどかったのでおうちでおとなしくしていました。


all()メソッドで、全てのエンティティをロードすることができます。

>> var posts = model.Post.all();
>> posts.length
1
>> posts[0].title
たいふうが じょうりくしたよ
>> posts[0].body
今日は台風が来て雨と風がひどかったのでお風がひどかったのでおうちでおとなしくしていました。