ActiveRecordとMongoidは共存できる
第5回 MongoDB.jp 勉強会 in Tokyoに行ってきた! メモとかはまたのちほどアップするとして(そういえばRubyKaigi最終日のメモもアップできていない)、@yuki24 さんの発表で「ActiveRecordとMongoidは共存」できるという話を聞いて、ちょっと試してみた。
その過程で適当に作ったコードをgithubに上げておく。Todoを作成・更新した際にその内容をTodoLogに吐き出すというモノ。
mongoidのインストール
これは普通に。
$ gem install bson_ext mongoid $ rails g mongoid:config
Mongoidのモデルの作成
mongoidをインストールするとmodelジェネレータがmongoidのモデルファイルを生成してくれる。
$ rails g model todo_log title:string done:boolean invoke mongoid create app/models/todo_log.rb
ActiveRecordのモデルの作成
modelジェネレータがmongoidに割り振られたので、代わりにactive_record:modelジェネレータを使う。
$ rails g active_record:model todo title:string done:boolean create db/migrate/20110730071022_create_todos.rb create app/models/todo.rb
これはrails g
コマンドの出力を見て初めて気づいた。
アプリでやってること
Todoのafter_create、after_updateコールバックにTodoLog.createを追加すれば、TodoLが作成・更新された際にTodoLogが作成される。
最後に
やってみれば当たり前なんだけどちゃんと動く。 mongoid入れただけでmodelがそれ用のジェネレータになっていたのでできないものだと思ってた。 調べてみるってとても大事。
あとスキーマレスは便利。ついさっき、「TodoLogなんだからtodo_id入れなきゃな」と気づいたのでコードをちょっとだけ修正したのだけれど、それだけでtodo_idが保存されるようになった。凄く手軽。 もちろん後から追加したんだから、それ以前のレコードにはtodo_idは保存されていないんだけど。