Skip to content

Instantly share code, notes, and snippets.

@hiroshi
Created June 1, 2011 06:16
Show Gist options
  • Save hiroshi/1001866 to your computer and use it in GitHub Desktop.
Save hiroshi/1001866 to your computer and use it in GitHub Desktop.
Rails 3.0 app + Mongoid による MongoHQ へのアクセスの実験

メモ - Mongoid による MongoHQ へのアクセスの実験

Rails app への Mongoid 導入

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

MongoHQ で database 作成

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 が表示されるはず。

Mongoid のモデルを使った resouce

ORM が mongoid の状態で、 scaffold を生成するとほぼ ActiveRecord と同じコードが生成されます。

Heroku

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

リファレンス

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment