Sinatra+mongoDB

11th Jan, 2010 | mongodb sinatra ruby

このブログシステムは Sinatra とKVS(とりあえず最初は mongoDB )で遊ぶために作った。

ここ数カ月、RoRを使って開発してみてるけど(その前はphp)、やっぱり色々と重厚すぎるので、ちょっとしたWebアプリには向いてない気がしている。

で、Sinatraを試してみたんだけどなかなかいい感じ。後発だけあってRoRをかなり意識した上で無駄を削ぎ落した感じ。「無駄」というと怒られるか。

今回はSinatraとMongoDBの繋ぎの部分に MongoMapper を使ってみた。ruby + mongoDBで、rubyからmongoDBを使う場合、まだまだ「デファクト」と呼べるような物はないみたい。いくつか同じような物が開発中のよう。その中からMongoMapperを選んだのは最低限の機能ありそう+開発が活発ってぐらい。ただ、最近twitterでmongoidってのがあるというのを知って、少し試してみたけどそっちの方がいいかもしれない。MongoMapperはヘタにActiveRecordを意識しすぎている感じがする。

SinatraからMongoMapperを使うのに特に難しいところはない。gemで両方インストールして後はドキュメントにある使い方をするだけ。たとえば、このブログで使ってる一番シンプルなクラスだと、

class User
  include MongoMapper::Document
  
  key :login, String, :required => true, :unique => true
  key :name, String, :required => true
  timestamps!
end

これだけで、後はActiveRecordっぽく使える。

例:

% irb19 -r app.rb
>> u = User.create!(:login=>'masatomo', :name=>'Masatomo Nakano')
=> #<User _id: 4b4b9e89a90e088f03000001, login: "masatomo", name: "Masatomo Nakano", created_at: 2010-01-11 21:56:25 UTC, updated_at: 2010-01-11 21:56:25 UTC>
>> u.name = 'Masatomo, updated'
=> "Masatomo, updated"
>> u.save!
=> true
=> 

% irb19 -r app.rb
>> u = User.find_by_login('masatomo')
=> #<User _id: 4b4b9e89a90e088f03000001, login: "masatomo", name: "Masatomo, updated", created_at: 2010-01-11 21:56:25 UTC, updated_at: 2010-01-11 21:56:40 UTC>
>>

みたいな感じでMongoDBを特に意識せずに使える。

mongoDBに限ったことではないけど、RDBMSを使う場合と違って新しいフィールドを追加した場合にもUserクラスだけ拡張すればいい。特に開発序盤ではこれがすごく楽。


記事の内容についての質問、苦情、間違いの指摘等なんでもtwitterでどうぞ。