Rails3 対応 MongoDB ORM、Mongoid 詳解―インストール
まずは、インストールの解説です。
$ gem install mongoid --pre
Rails3 対応の最新版は執筆時点で 2.0.0.beta.16 で、ベータ版なので、--pre オプションを使ってインストールします。2.0.0 リリースの際には、--pre を取って下さい。
そして、mongo ドライバー自体のパフォーマンスを上げるために、bson_ext をインストールしましょう。
$ gem install bson_ext
bson_ext には、boost が必要です。MongoDB のインストール時にインストールされていると思いますので、問題ないと思います。もし、インストールできなくても動きますので、気にしないで下さい。
Rails 3 でのインストール
Rails3 は Bundler を使用しており、必要な Gem を、Gemfile というファイルに書くことになります。
gem "mongoid", "2.0.0.beta.16" gem "bson_ext", "1.0.4"
2.0.0 リリースの暁には、バージョンの部分を描き直してください。
$ bundle install vendor/bundle
で、vendor/bundle 以下に、Mongoid や依存している Gem がインストールされ、Rails が使用します。Git を使用している方は、.gitignore に vendor/bundle を記入するのを忘れないようにしましょう。
Gemfile を書き換えた後、アップデートをかけるには、
$ bundle update
とします。
設定
Mongoid の設定をするためには、次のコマンドを打ちます。
$ rails generate mongoid:config
すると、config/mongoid.yml が生成され、デフォルトの ORM が Mongoid になるので、rails generate model Foo などとした際に、Mongoid のモデルが作成できるようになります。
それでは、config/mongoid.yml を、自分の環境に合わせて書き換えましょう。
defaults: &defaults host: localhost slaves: - host: slave1.local port: 27018 - host: slave2.local port: 27019 autocreate_indexes: false allow_dynamic_fields: true include_root_in_json: false parameterize_keys: true persist_in_safe_mode: false raise_not_found_error: true reconnect_time: 3 development: <<: *defaults database: hoge_development test: <<: *defaults database: hoge_test # set these environment variables on your prod server production: <<: *defaults host: <%= ENV['MONGOID_HOST'] %> port: <%= ENV['MONGOID_PORT'] %> username: <%= ENV['MONGOID_USERNAME'] %> password: <%= ENV['MONGOID_PASSWORD'] %> database: <%= ENV['MONGOID_DATABASE'] %>
host はそのままですね、接続する MongoDB が動いているホストです。
port が省略されていますが、デフォルトでは 27017 番になります。
slaves の項は、スレイブのサーバーがある時です、開発用にはないと思うので、削除したら良いです。
その他のパラメーターは以下を意味します。
autocreate_indexes | デフォルトは false です。true にした場合は、モデルクラスがロードされた際に毎回インデックスが付与されます。 development や test 以外の環境では推奨されません。 |
allow_dynamic_fields | モデルクラスにフィールドとして設定されてない属性が呼び出されたときに、オブジェクトに属性を付け加えます。デフォルトは true で、false にした場合は、フィールドとして設定されてない属性に値をセットしたときに、例外があがります。スキーマレスな MongoDB ならではの機能です。 |
include_root_in_json | デフォルトは false です。true にした場合は、モデルで #to_json が呼ばれたときに、JSONのトップレベルにドキュメント名が付き、関連のそれぞれのトップレベルにもドキュメント名が付きます。JSON API を作る際に変更が必要になるかも知れません。 |
parameterize_keys | キーの特殊文字をSEOフレンドリーな文字へと置換します。デフォルトは true です。 |
persist_in_safe_mode | 全てのデータベース操作をセーフモードで行ないます。MongoDB の採用している GridFS の機能で、データを保存する際、クライアントとサーバでそれぞれMD5ハッシュを生成し、一致しなかった場合は例外を上げます。デフォルトは false です。true にした場合はパフォーマンスが落ちますので気をつけて下さい。 |
raise_not_found_error | id で検索した際に、ドキュメントがなかった場合に、Mongoid::Error::DocumentNotFound 例外を上げます。デフォルトは true です。false にした場合は、例外を上げずに nil を返します。 |
reconnect_time | データベースとつながらない際に、再接続を試みる最大時間を設定します。デフォルトは3秒です。 |
skip_version_check | MongoHQ や MongoMachine などを使用しているときに、システムのコレクションが接続を許さないせいで、認証の問題が起きた場合に true にして下さい。 |
ログ
Rails のデフォルトのログ機能を使いたくない場合に、独自のログ機能を設定できます。
config/application.rb
module Hoge class Application < Rails::Application ... config.mongoid.logger = Logger.new($stdout, :warn) ... end end
ActiveRecord の削除
これから Mongoid を使用するので、ActiveRecord はロードする必要がありません。
config/application.rb の先頭部分を以下のように書き換えます。
#require 'rails/all' require "action_controller/railtie" require "action_mailer/railtie" require "active_resource/railtie"
他言語
デフォルトで Mongoid は、英語の国際化ファイルが追加されております。他の言語を追加するには、config/initializers/mongoid.rb を作成し以下の内容を追加します。
# adds Spanish Mongoid.add_language("es")
現在のところ、以下の言語に対応しています。
- es: スペイン語
- fr: フランス語
- it: イタリア語
- pl: ポーランド語
- pt: ポルトガル語
- sv: スウェーデン語
これら全てを有効にしたい場合は、
# include all language that Mongoid knows about Mongoid.add_language("*")
とします。
Rails 3 以外の設定
Mongoid.configure ブロックを使用して設定することができます。
Mongoid.configure do |config| dbname = "hoge_development" host = "localhost" config.master = Mongo::Connection.new.db(dbname) config.slaves = [ Mongo::Connection.new(host, 27018, :slave_ok => true).db(dbname) ] config.persist_in_safe_mode = false end
YAML ファイル、config/mongoid.yml を作成してロードすることもできます。
file_name = File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml") @settings = YAML.load(ERB.new(File.new(file_name).read).result) Mongoid.configure do |config| config.from_hash(@settings[ENV['RACK_ENV']]) end
インストールについては以上になります。