Rails で MongoDB を使ってみた
Ubuntu Karmic (9.10) で MongoDB + mongoid を使って簡単な Rails アプリケーションを作ってみました。
MongoDB とは、最近注目を集めつつあるドキュメント指向データベースの一種。mongoid は MongoDB にアクセスするための RubyGems。
参考資料:
次の行を /etc/apt/sources.list の末尾に追加
deb http://downloads.mongodb.org/distros/ubuntu 9.10 10gen
aptitude で MongoDB をインストール。
% sudo aptitude update % sudo aptitude mongodb-stable
Windows を含む他の OS でのインストール手順については、Quickstart - MongoDB をご覧ください。
動作確認。
% mongo
MongoDB shell version: 1.2.4
url: test
connecting to: test
type "help" for help
> db.foo.save( { a : 1 } )
> db.foo.find()
{ "_id" : ObjectId("4ba7859134532c5d5844387e"), "a" : 1 }
> exit
bye
mongod の停止と開始。
% sudo service mongodb stop % sudo service mongodb start
ここからは、http://mongoid.org/docs/installation に従って、Rails アプリケーションをセットアップ。
gem で mongoid, mongo_ext をインストール。mongo_ext は高速化のための拡張ライブラリ。
% sudo gem install mongoid % sudo gem install mongo_ext
新規アプリケーション papagena を作成。
% rails papagena % cd papagena
config/environment.rb に次の行を追加(Rails::Initializer.run do |config| ... end の間に)。
config.load_paths += %W( #{RAILS_ROOT}/app/documents )
config.gem "mongoid", :lib => "mongoid", :version => "1.2.14"
config/database.mongo.yml
development: host: localhost database: papagena_dev
config/initializers/mongoid.rb
File.open(File.join(RAILS_ROOT, 'config/database.mongo.yml'), 'r') do |f| @settings = YAML.load(f)[RAILS_ENV] end Mongoid.configure do |config| name = @settings["database"] config.master = Mongo::Connection.new.db(name) end
app/documents ディレクトリを作成。
% mkdir app/documents
app/documents/person.rb
class Person
include Mongoid::Document
field :first_name
field :last_name
def full_name
"#{first_name} #{last_name}"
end
end
public/index.html を削除。
% rm public/index.html
config/routes.rb
ActionController::Routing::Routes.draw do |map| map.root :controller => 'people' map.resources :people end
app/controllers/people_controller.rb
class PeopleController < ApplicationController
def index
@people = Person.all
end
def show
@person = Person.find(params[:id])
end
def new
@person = Person.new
end
def edit
@person = Person.find(params[:id])
end
def create
@person = Person.new(params[:person])
if @person.save
redirect_to @person
else
render :action => 'new'
end
end
def update
@person = Person.find(params[:id])
@person.attributes = params[:person]
if @person.save
redirect_to @person
else
render :action => 'edit'
end
end
def destroy
@person = Person.find(params[:id])
@person.destroy
redirect_to :people
end
end
app/views/index.html.erb
<h1>People#index</h1>
<ul>
<% @people.each do |person| %>
<li>
<%= link_to h(person.full_name), person %>
<%= link_to 'Edit', [ :edit, person ] %>
<%= link_to 'Delete', person, :method => :delete %>
</li>
<% end %>
</ul>
<%= link_to 'New person', [ :new, :person ] %>
app/views/show.html.erb
<h1>People#show</h1> First Name: <%= @person.first_name %><br /> Last Name: <%= @person.last_name %><br /> <%= link_to 'List', :people %>
app/views/new.html.erb
<h1>People#new</h1> <% form_for @person do |f| %> <%= f.label :first_name %> <%= f.text_field :first_name %><br /> <%= f.label :last_name %> <%= f.text_field :last_name %><br /> <%= f.submit %> <% end %>
app/views/edit.html.erb
<h1>People#edit</h1> <% form_for @person do |f| %> <%= f.label :first_name %> <%= f.text_field :first_name %><br /> <%= f.label :last_name %> <%= f.text_field :last_name %><br /> <%= f.submit %> <% end %>
アプリケーションを起動。
% ruby script/server
お、動いた!
気付いたこと。
- データベースを create するという操作は不要。いきなり使える。
- マイグレーションも不要。
- オブジェクトの id は 4ba792d257e5fb15cc000001 のような形式の値。
- したがって、show アクションの URL は http://localhost:3000/people/4ba792d257e5fb15cc000005 のようになる。
これは面白い。
MongoDB の説明によれば、トランザクションがない代わりに、負荷分散がやりやすい。つまり、お金やポイントの取り扱いには向かないけど、いわゆる「コンテンツ」を大量に保存するなら RDBMS より向いているかもしれない。例えば、大規模なコミュニティサイトを構築したいなら、ポイント関連のデータを MySQL に保存して、ユーザー間のメッセージなどを MongoDB に保存するといった使い分けをすればいいわけだ。
(2010/03/23)
記事に関するご質問は、 hermes@oiax.jp までメールでお送りください。
ウェブサイト構築の発注先を検討されているお客様は、ご相談フォームをご利用ください。
- はじめに
- Rails はエンタープライズの世界で主流になるか (2008/03/29)
- Rails 2.0 ベンチマーク (2008/03/30)
- テスト駆動開発とデバッグコード (2008/04/07)
- Git or Mercurial (2008/04/22)
- RESTful Ruby on Rails -- その美しさと難しさ (2008/04/23)
- RESTful Ruby on Rails -- 単数と複数 (2008/04/24)
- Rails のソースコードを読む (2008/05/02)
- sudo: no passwd entry for app! (Capistrano 2.3.0) (2008/05/12)
- Rails on GlassFish (2008/06/18)
- 「Ruby は型宣言がないけど、ちゃんとしたシステムに使えるのか」という質問にどう答えるか (2008/11/23)
- 「Ruby はスクリプト言語だけど、遅くないですか」という質問にどう答えるか (2008/11/24)
- どのプログラミング言語が将来的に有望か (2009/01/10)
- どのフレームワークが将来的に有望か (2009/01/11)
- フレームワーク対 CMS (2009/01/12)
- Rails 2.3 で spawner/reaper は DEPRECATED に (2009/03/25)
- db/seeds.rb (2009/06/08)
- LESSとSass (2009/08/03)
- Rails 2.3.4 と I18n (2009/08/15)
- RubyGems のアップデート(上書きインストール) (2010/02/03)
- クリエイティブ・コモンズの Rails 教材 (2010/03/08)
- Yet Another Ruby Reference (2010/03/12)
- Rails で MongoDB を使ってみた (2010/03/23)
- Rails で MongoDB を使ってみた(2) (2010/03/25)
- 祝 Ruby on Rails 3.0 beta2 リリース (2010/04/02)
- Rails 3.x 時代のテストフレームワーク (2010/04/24)
- Test::Unit と RSpec と Shoulda (2010/05/06)
- 続・Rails 3.x 時代のテストフレームワーク (2010/05/06)
- Windows + Rails + MySQL 5.1 (2010/07/20)
- Ruby on Rails 2.3.9 リリース (2010/09/05)
- Railtie と Engine と Plugin の関係 (2010/10/23)
- Rails 3.0 と Internet Explorer (2010/11/19)
- acts_as_list: gem か plugin か (2010/11/29)
- さようならNetBeans/こんにちはRedcar (2011/01/28)
- RubyGems 1.5 が出たけど (2011/02/04)
- はじめる!Rails3 第2巻の執筆を始めました (2011/03/20)
- NetBeans 7.0にRuby on Railsプラグインをインストールする手順 (2011/03/21)
- Resqueを利用したRailsでの非同期処理/バッチ処理 (2011/03/23)
- Resqueワーカーをデーモンとして動かす (2011/04/02)
- はじめる!Rails3 第2巻の執筆(経過報告) (2011/04/23)
- はじめる!Rails3 第2巻の執筆(経過報告 No.2) (2011/05/11)
- Rails 3.1: assign_attributesメソッド (2011/05/14)
- Rails 3.1: has_secure_passwordメソッド (2011/05/27)
- はじめる!Rails3 第2巻の執筆(経過報告 No.3) (2011/06/06)
- Ruby on Rails 3.2 を Windows にインストールする手順をかなり丁寧に説明してみました (2011/07/22)
- Ruby on Rails 3.2 を Mac OS X にインストールする手順をかなり丁寧に説明してみました (2011/08/07)
- はじめる!Rails3 第2巻の執筆(経過報告 No.4) (2011/08/15)
- WindowsマシンにUbuntuをインストールしてRails開発を始めるには (2011/08/29)
- Rails 3.xでISO-2022-JP(JISコード)の電子メールを送る: mail-iso-2022-jp (2011/12/05)
- はじめる!Rails3 第3巻について (2011/12/30)
- NetBeans 7.1にRuby on Railsプラグインをインストールする手順 (2012/01/26)
- はじめる!Rails3 第3巻について(経過報告) (2012/02/29)
- はじめる!Rails3 第3巻について(経過報告2) (2012/03/17)
- Ruby on Railsで複合キーを扱う(1) (2012/03/25)
- Ruby on Railsで複合キーを扱う(2) (2012/03/26)
- Ruby on Railsで複合キーを扱う(3) (2012/03/27)
- Ruby on Railsで複合キーを扱う(4) (2012/03/28)
- Ruby on Railsで複合キーを扱う(5) (2012/03/29)
- Ruby on Railsで複合キーを扱う(6) -- 最終回 (2012/03/31)
- Ruby on Railsで複合キーを扱う(7) -- 補遺 (2012/04/01)
- Ruby on Rails 3.2 を Ubuntu にインストールする手順をかなり丁寧に説明してみました (2012/04/22)
- Ruby on Rails 3.2 を Cygwin にインストールする手順をかなり丁寧に説明してみました (2012/05/05)
- Ruby/Railsを学習・開発する環境としてのCygwin (2012/05/06)
- UbuntuにNetBeans IDE 7.1をインストールする手順 (2012/06/08)
- UbuntuにNetBeans IDE 7.2をインストールする手順 (2012/08/22)
- NetBeans 7.2にRuby on Railsプラグインをインストールする手順 (2012/08/31)
- RSpecとCapybaraでJavaScript/Ajaxをテストする (2012/10/01)
- Passenger 向けに AppArmor を設定する (2013/01/06)
- Railsセキュリティアップデートへの対処法 (2013/01/30)
- NetBeans 7.3にRuby on Railsプラグインをインストールする手順 (2013/05/02)

