Rails3 対応 MongoDB ORM、Mongoid 詳解―その他
Mongoid にはアプリケーションで使える、いくつかの役に立つ機能があります。
マスター/スレイブ サポート
mongoid.yml でスレイブデータベースを設定しているなら、スレイブを有効化した読み取りクエリを、ラウンドロビンでスレイブデータベースを参照します。また、クエリ単位でも制御することができます。
モデルの全ての読み取りを、スレイブ間でラウンドロビンします:
class Person include Mongoid::Document enslave end
enslave Criteria を使って、クエリ単位で、スレイブから読み取ります:
Person.where(:first_name => "Durran").enslave
キャッシュ
Mongoid は、何も設定していないそのままの状態で、大きなクエリとデータセットでメモリが効率的に使われるように、MongoDB の Ruby ドライバーのカーソルをラップしています。しかしながら、メモリの中に全てのヒットしたドキュメントをロードしたい場合や、それらをデータベースに複数回問い合わせることなく返したい場合に、cashe マクロと Criteria を使うことができます。
モデルに対する全てのクエリがキャッシュされます:
class Person include Mongoid::Document cache end
クエリ単位でのキャッシュ:
Person.where(:first_name => "Durran").cache
ダーティー・アトリビュート
Mongoid には、ActiveModel スタイルのダーティー・アトリビュート・モジュールが実装されています。これらは、ActiveModel の API に厳密に従います:
class Person include Mongoid::Document field :first_name end person = Person.new(:first_name => "Leroy") person.first_name = "Lauren" person.changed? # true person.first_name_changed? # true person.first_name_was # Leroy person.first_name_change # [ "Leroy", "Lauren" ] person.changes # { "first_name" => [ "Leroy", "Lauren" ] }
パラノイド ドキュメント
ドキュメントを削除するとき、削除フラグをつけて、実際にはデータベースから削除したくない場合があると思います。Mongoid はそういう時のために Pranoia モジュールを提供しています。
class Person include Mongoid::Document include Mongoid::Paranoia end person.delete # deleted_at フィールドに現在時刻をセットします person.delete! # ドキュメントを完全に削除します person.destroy! # コールバックとともにドキュメントを完全に削除します person.restore # 削除されたドキュメントを復帰します
バージョン管理
Mongoid は、Mongoid::Versioning モジュールをインクルードすることにより、シンプルなバージョン管理をサポートします。このモジュールをインクルードすれば、保存の時に、version フィールドを作成します。version 番号は整数で、保存のたびに更新されます。
class Person include Mongoid::Document include Mongoid::Versioning end
max_versions を設定することができます。Mongoid は最新のバージョンが設定された最大値を超えないようにします。
class Person include Mongoid::Document include Mongoid::Versioning # 最大5バージョンだけ記録する max_versions 5 end
タイムスタンプ
Mongoid は Mongoid::Timestamps モジュールで、タイムスタンプをサポートします。created_at と updated_at フィールドが、それぞれ自動的に付与されます。
class Person include Mongoid::Document include Mongoid::Timestamps end
キー
key マクロを使うことで、デフォルトの id の代わりに、複合キーを作成することができます。
class Person include Mongoid::Document field :first_name field :last_name key :first_name, :last_name end person = Person.new(:first_name => "Syd", :last_name => "Vicious") person.id # "syd-vicious" を返します。
違うコレクションに保存する
store_in マクロを使えば簡単です。
class Person include Mongoid::Document store_in :students end
その他は以上です。