db2 on Rails
DB2でさくさく実現するRESTfulなDBアプリ(1)

RailsアプリからDB2にアクセスするための基礎知識

日本アイ・ビー・エム株式会社
Team Ruby
成毛久美子
2008/10/3

ユーザー表へのカラムの追加

 ActiveScaffoldは、その名のとおり、動的にアプリケーションを作成し実行します。データベースの表にカラムを追加すると、アプリケーションの修正なしで反映されます。

 ここでは、それを確認するため、ユーザー表に振り仮名を格納するstring型のkanaというカラムを追加します。

カラム追加用スクリプトとデータベースへの反映

 カラムの追加は、migrationコマンドを使用してリスト10のように行います。スクリプトができたら、rakeコマンドででデータベースへ反映します。

●リスト10 migrationによるカラム追加
C:\demo>ruby script\generate migration add_kana_to_users kana:string
      exists  db/migrate
      create  db/migrate/002_add_kana_to_users.rb
C:\demo>rake db:migrate
(in C:/ruby/demo)
== 2 AddKanaToUser: migrating =================================================
-- add_column(:users, :kana, :string)
   -> 0.0940s
== 2 AddKanaToUser: migrated (0.0940s) ========================================
C:\demo>

 Webサーバを立ち上げ直す必要も、アプリケーションを修正する必要もなく、Webブラウザを再読み込みすると、画面にkana項目が追加されることが確認できます(図2)。scaffoldなどの静的なアプリケーションでは、このように動的に変更することはできません。

●図2 カラムが追加された
fig2

関連付けの作成

 2つの表の関連付けを定義することにより、それぞれの保守アプリケーションもリンクされます。組織のデータを持つ表を作成し、先ほど作成したユーザー表との関連付けを定義します。

組織表の作成とユーザー表の修正

 ユーザー表と同様に組織表(org)を作成します(リスト11)。

●リスト11 組織表用モデルスケルトンの作成
C:\demo>ruby script\generate model org name:string
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/org.rb
      create  test/unit/org_test.rb
      create  test/fixtures/orgs.yml
      exists  db/migrate
      create  db/migrate/003_create_orgs.rb
C:\demo>

 ユーザーに組織の情報を持たせたいので、ユーザー表にorg_idを追加します(リスト12)。

●リスト12 ユーザー表へのorg_idの追加
C:\demo>ruby script\generate migration add_org_id_to_users org_id:integer
      exists  db/migrate
      create  db/migrate/004_add_org_id_to_users.rb
C:\demo>

 リスト12までの作業が済んだら、rakeを使ってデータベースへ反映させます(リスト13)。

●リスト13 データベースへの変更の反映
C:\demo>rake db:migrate
(in C:/ruby/demo)
== 3 CreateOrgs: migrating ====================================================
-- create_table(:orgs)
   -> 0.0780s
== 3 CreateOrgs: migrated (0.0780s) ===========================================

== 4 AddOrgIdToUser: migrating ================================================
-- add_column(:users, :org_id, :integer)
   -> 0.0160s
== 4 AddOrgIdToUser: migrated (0.0160s) =======================================
C:\demo>

組織コントローラの作成

 ここからは、組織のコントローラを作成します。ユーザーのコントローラをコピーして作成すると簡単です。サンプル3の内容を記述したファイルをapp\controllersディレクトリ配下にorgs_controller.rbという名前で保存します。

●サンプル3 orgs_controller.rb
class OrgsController < ApplicationController
  active_scaffold :org
  layout "activescaffold"
end
  

関連付けの追加

 関連付けを追加します。関連付けは、has_many、belongs_toを使用します。組織から見てユーザーは1対多なので、has_manyを指定し、ユーザーはどこかの組織に属するので、belongs_toを指定します(図3)。

●図3 概念データモデル

  具体的には、app\modelsの表名.rbのファイルに定義します(サンプル4、5)。

●サンプル4 org.rb
class Org < ActiveRecord::Base
  has_many :users
end
  
●サンプル5 user.rb
class User < ActiveRecord::Base
  belongs_to :org
  end

アプリケーションの実行・動作の確認

 アプリケーションを実行します。Webブラウザから「http://localhost:3000/Orgs/list」にアクセスすると、組織の情報が見られますが、その組織に所属するユーザーの情報も見ることが可能です。また、そのユーザーを展開することで、ユーザーの詳細情報の表示も可能です。適当なデータを入れて実行すると図4〜6のように表示されます。

●図4 初期状態の画面
fig4
●図5 データの入力
fig5
●図6 入力した内容が反映された
fig6

前のページへ 3/4 次のページへ

Index
DB2でさくさく実現するRESTfulなDBアプリ(1)
RailsアプリからDB2にアクセスするための基礎知識
・環境の作成
DB2 9.5の無償版 Express-Cを導入|Ruby実行環境を整える|Railsの導入|ibm_dbドライバもパッケージから導入できる|データベースの作成
・プロジェクトの作成と設定
プロジェクトの作成|データベース接続の設定
・アプリケーションの作成
ActiveScaffoldプラグインの導入|モデルの作成とテーブルの作成|コントローラの作成|標準レイアウトの追加|サーバの起動と動作確認
→ Page 3
・ユーザー表へのカラムの追加
カラム追加用スクリプトとデータベースへの反映|関連付けの作成|組織表の作成とユーザー表の修正
・組織コントローラの作成
関連付けの追加
・アプリケーションの実行・動作の確認
・さらにカスタマイズする
・次回、実践編は……

DB2でさくさく実現するRESTfulなDBアプリ



Database Expert フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Database Expert 記事ランキング

本日月間