メモ - Mongoid による MongoHQ へのアクセスの実験
ruby/rails で MongoDB を使うときのメジャーな選択肢として MongoMapper, Mongoid がありますが、
- Mongoid の方が後発、
- Mongoid の方が 2011/6 の段階で rails 3 対応、ドキュメントなどが充実しているらしい などの理由により、 Mogoid を使います。 (あまり詳しく調べてませんが、問題が発生したら乗り換えることもそんなに難しくないはず)
新規アプリを作るなら -O オプションで ActiveRecord を off に、 既存のアプリなら、 config/application.rb で
# require "active_record/railtie"
Gemfile に
gem "mongoid"
gem "bson_ext"
bson_ext はオプションですが、利用しないと mongoid は pure ruby の bson gem を利用するため、パフォーマンス上の問題があるという警告を出します。
config/mongoid.yml を生成
rails g mongoid:config
あとはテスト用のリソースを生成
rails g resource users
ActiveRecord のモデルのかわりに Mongoid のモデルが生成されるはずです。
# app/models/user.rb
class User
include Mongoid::Document
end
https://mongohq.com/ でアカウントを作成して、 (パスワードはあとで平文でファイルに書いたりするので重要でないものにする) free の database を作成、 URI が表示されるのでそれを config/mongoid.yml に記述
development:
uri: mongodb://{user}:{pass}@flame.mongohq.com:{...}
# host: localhost
# database: test_app_development
rails c
> User.create(:name => "hiroshi")
=> #<User _id: 4de5a45a7f4d793003000001, _type: nil, name: "hiroshi">
> User.all.to_a
=> [#<User _id: 4de5a1b2becde5e53f43450c, _type: nil, name: "hiroshi">]
MongoHQ の users collection にも追加した document が表示されるはず。
ORM が mongoid の状態で、 scaffold を生成するとほぼ ActiveRecord と同じコードが生成されます。
Heroku | Dev Center | MongoHQ には Heroku の MongoHQ addon についてのドキュメントがありますが、自分が MongoHQ のサイトから作成したアカウント以下の database にアクセス限り addon は必要なく、 config/mongoid.yml の production に uri を直接記述すれば Heroku でも動きます。
Heroku の addon を使うと Heroku の MongoHQ アカウント以下の database が自動で生成されて、URL は ENV["MONGOHQ_URL"] で参照できるようになります。
# config/mongoid.yml
production:
uri: <%= ENV["MONGOHQ_URL"] %>
ActiveRecord などの RDB の ORM だとスキーマにフィールド(カラム)は定義するけど、 MongoDB にスキーマはないので、 User.new.name で undefined method になってしまうので、モデルに、
field :name, :type => String