babie steps

作業療法記録

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 MongoHQMongoMachine などを使用しているときに、システムのコレクションが接続を許さないせいで、認証の問題が起きた場合に 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


インストールについては以上になります。