ここ数カ月、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でどうぞ。 Tweet