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は保存されていないんだけど。