babie steps

作業療法記録

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


その他は以上です。