Rubyアドベントカレンダー:rubyでmongodbと戦うときにしっていったほうがいいいくつかのこと(未完了)
Ruby Adventカレンダー参加です。
体調を崩してしまい、熱がでるなら出て寝込みたいのですが、ただひたすら怠いだけで熱もでない状態なので大変辛いです。最近流行てしまっているmongoDBをrubyで使うときに決行大変な思いをしたのでそのへんをまとめて記しておきたいと思います。
病院いったら口内ヘルペスが大量発生してやんごとなき状況になりつつあるので書きかけのまま投稿します。。。
ruby用のmongoDBドライバーの種類
mongo/mongoMapper/mongoid
大きく分けてこの3種類がある
"mongo"はO/R Mapperなどの機能はなくmongoへのinterface、後ろ2個はO/R Mapperの機能を提供している。
インストールは簡単
もうruby1.9.2ならgem installで入ります。終わり。
ないならrvmでもつかってください。
問題が使い方
ふつーRailsで使おうとおもうので、mongoidを使ってみます。
今回の案件では、そもそもCSVデーターのフォーマットがきまっていなかったために、カラムフリーかつ、複数レコード1documentにしたかったのでmongoを選択しました。
……でふたを開けてみたらびっくり。
mongoidをつかうと、事前にmongoidのクラスを定義してcolletionの定義をしないといけないのです。
こんなの全然Document指向のmongoと相反していて使い物になりません。
で、どうするか……。
しょうがないので定義をymlで書いた
今回は1Documentにある方法で識別可能なn個のレコードを格納するので設計はmongoidでいうhas_many関係で記述できます。
とりあえずymlに定義をかいて、rubyのclassにclass_evalをつかって記述方法や、evalでやる方法でクラスを動的に作る方向にしました。ただ、実行時のオーバーヘッドが高いので最終的に初回起動時にファイルに書き出してincludeする方法にしました。
でもyml更新するのめんどい
エンドユーザーに試しに使ってもらったらymlのインデントをタブで書いたりして運用ができないとうことなので、困った私は、csvの1行目を定義につかうことで動的にmongoのDocumentクラスをつかう運用に変更。
でも奴らは日本語を使う
やっぱり動かないのでどうしたのかとおもったら、1行目のカラム名が日本語になっていてなにもできない。こればっかりはどうしょうもないので、ここでmongoidを使うのを放棄。