Rails3 対応 MongoDB ORM、Mongoid 詳解―インテグレーション

CARRIERWAVE

ファイルアップロードを扱う Carrierwave は Mongoid をサポートしています。現在のところ、ファイルと S3 に格納することを指定できます。:mount_on オプションがアップローダークラスに定義されてない場合は、ファイル名が アップローダー名_filename をフィールド名として、格納されます。

class User
  include Mongoid::Document
  mount_uploader :avatar, AvatarUploader #field is avatar_filename
end

CUCUMBER

MongoDB はトランザクションをサポートしていないので、それぞれのフィーチャーが実行される前に、データベースがクリーンになるように、Cucumber にフックを追加したいと思います。

features/support/hooks.rb:

Mongoid.master.collections.select do |collection|
  collection.name !~ /system/
end.each(&:drop)


もし、database_cleaner という Gem を使っているなら、代わりに、features/support/database_cleaner.rb を作成してください。

require 'database_cleaner'
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.orm = "mongoid"
Before { DatabaseCleaner.clean }

RSPEC

Cucumber と同じように、RSpec の use_transactional_fixtures は Mongoid では影響しません。スイートを実行した後、データベースをクリーンにすることができます。

spec/spec_helper.rb:

Rspec.configure do |config|
  config.after :suite do
    Mongoid.master.collections.select do |collection|
      collection.name !~ /system/
    end.each(&:drop)
  end
end

おまけに :each の後何かすることもできますが、たくさんのインテグレーションスペックがある場合、遅くなるので注意してください。


もし、database_cleaner という Gem を使っているなら、代わりに、spec/spec_helper.rb の RSpec コンフィグブロックで以下の行を付け足してください。

Rspec.configure do |config|
  require 'database_cleaner'
  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner.orm = "mongoid"
  end

  config.before(:each) do
    DatabaseCleaner.clean
  end
end

DEVISE

Mongoid で動くように Devise をセットアップするためにやることは、ActiveRecord を呼び出しているところを削除して、Mongoid に置き換えることです。

config/initializers/devise.rb:

# ==> ORM configuration
# Load and configure the ORM. Supports :active_record (default),
# :mongoid (bson_ext recommended) and :data_mapper (experimental).
require "devise/orm/mongoid"

PASSENGER

MongoDB ウィキでは、Passenger の Smart spawning が有効なとき(デフォルトでは Conservative spawning です)、イニシャライザでインクルードする必要があると警告してますが、Mongoid では、特に何かする必要はありません。Passenger がこのモードで起動しているとき、ワーカーがフォークされたら、Mongoid はそれを検知し、再接続するようになっています。

UNICORN

Unicorn では、preload_app を true にセットする以外は、特に Mongoid で必要な設定はありません。Unicorn が子ワーカーをフォークしたら、Mongoid はそれを検知し、次のクエリでデータベースへ再接続します。


インテグレーションは以上です。