Rails で MongoDB を使ってみた(2)
前回に引き続き、MongoDB で Rails アプリを作る話。
今回は関連づけに挑戦だ。
参考資料:
app/documents/person.rb に has_one :address を追加。
class Person
include Mongoid::Document
field :first_name
field :last_name
has_one :address
def full_name
"#{first_name} #{last_name}"
end
end
app/documents/address.rb を作成。ただし、ほとんど参考資料からのパクリ。
class Address
include Mongoid::Document
field :street
field :city
field :state
field :post_code
belongs_to :person, :inverse_of => :address
def to_s
[ street, city, state, post_code ].select { |value| value.present? }.join(', ')
end
end
app/views/people/_form.html.erb
<% 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 />
<fieldset>
<legend>Address</legend>
<% f.fields_for :address do |g| %>
<%= g.label :street %>
<%= g.text_field :street %><br />
<%= g.label :city %>
<%= g.text_field :city %><br />
<%= g.label :state %>
<%= g.text_field :state %><br />
<%= g.label :post_code %>
<%= g.text_field :post_code %><br />
<% end %>
</fieldset>
<%= f.submit %>
<% end %>
app/views/people/new.html.erb
<h1>People#new</h1> <%= render :partial => 'form' %>
app/views/people/edit.html.erb
<h1>People#edit</h1> <%= render :partial => 'form' %>
app/views/people/show.html.erb
<h1>People#show</h1> First Name: <%= @person.first_name %><br /> Last Name: <%= @person.last_name %><br /> Address: <%= @person.address %><br /> <%= link_to 'List', :people %>
これで完成。ほとんど ActiveRecord と同じように使えることが分かった。
さて参考文献によれば、実際には Person オブジェクトと Address オブジェクトが「関連づけられる」というより、Address オブジェクトがハッシュとして Person オブジェクトに「埋め込まれる」ようだ。
ちょっと説明しづらいが、RDBMSと対比すると理解しやすいだろう。
RDBMSでは persons テーブルと address テーブルにそれぞれ 1 つずつレコードがあって、これらの2つのレコードが関連づけられる。
しかし、MongoDB は「ドキュメント」を集合として管理するデータベースだ。
つまり JSON で
{
first_name: "Tsutomu",
last_name: "Kuroda",
address: {
street: "30 Rockefeller Plaza",
city: "New York",
state: "NY",
post_code: "10112"
}
}
と表現できるようなオブジェクトを丸ごとデータベースに放り込む。
ただし、person.rb の has_one を has_one_related に変更すれば、Address オブジェクトはコレクションの要素としてデータベースに格納されるようになる。この場合、Person オブジェクトには Address オブジェクトの id だけが記録される。
http://github.com/durran/mongoid/ で最新のコードを見ると、has_one メソッドは embed_one メソッドに名前が変わっている。ActiveRecord と明らかに振る舞いが異なるので、作者の気が変わったようだ。
(2010/03/25)
記事に関するご質問は、 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)
- 続・Rails 3.x 時代のテストフレームワーク (2010/05/06)
- Test::Unit と RSpec と Shoulda (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.1 を Windows にインストールする手順をかなり丁寧に説明してみました (2011/07/22)
- Ruby on Rails 3.1 を 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)

