RingoJSのチュートリアルをやってみる - データストアの設定


久しぶりにRingoJSを触ってみます。チュートリアルConfiguring a Storeっていうところ。いよいよデータストアでしょうか。楽しみです。

RingoJSでは「model.js」というファイルにモデルの定義を書いていきます。データベース定義みたいなものですきっと。ただ、データだけではなく、モデルの振る舞いも併せて書くことができます。むしろこっちが本題な気がします。

規模の大きなプロジェクトでは「model」というディレクトリを作成し、その下に「モデル名.js」というファイルを作成しくこともできます。チュートリアルは単一の「model.js」で進めていきます。

model.js

チュートリアルには以下のような記述がありました。

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

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

が、このままだと動きませんでした。しばらく触ってないうちに使い方が変ったのかな。filestoreのStore関数は値を返さなくなってフォルダのパスを指定するだけの関数になったようです。defineEntity関数もモジュールレベルの関数になったみたい。

// model.js
var {Store} = require('ringo/storage/filestore');
Store('./db');

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

プログラムでエンティティの定義ができるというのは良いですね。上の例はチュートリアルなので分かりやすく書かれていましたが、以下のようにリファクタリングすることができます。

['Post', 'Comment'].forEach(function(model) {
  exports[model] = defineEntity(model);
});

ファイルストレージでエンティティを保存してみる

まずはbin/ringoの対話コンソールで動かしてみます。

>> var {Post, Comment} = require('model')
>> var post = new Post();
>> post.title = 'kyou ha yuki ga futta!';
kyou ha yuki ga futta!
>> post.body = 'untara kantara ~~~';
untara kantara ~~~
>> post.save();

Postエンティティを作成してtitleとbodyを設定してsave関数で保存してみました。
するとdbディレクトリの下にエンティティの名前でディレクトリが作られて、その下に連番のIDかな?とにかく「1」っていうファイルができていました。中身を見るとJSON形式のデータが格納されているようです。

$ find db
db
db/Post
db/Post/1
$ cat db/Post/1
{"title":"kyou ha yuki ga futta!","body":"untara kantara ~~~"}

眠くなってきた。今日はここまで。

感想

Google App Engineで使えるからって聞いてチュートリアルを始めたのに、ファイルストレージへのアクセスがチュートリアルに出てきたのはビックリした。あんまりGAEメインっていうものでもないのかな。リレーショナルデータベース用のデータストアもあるみたいだし。
早くGoogle App Engineのデータストアにデータを書いたり読んだりしたい。