CodeZine(コードジン)

特集ページ一覧

Judeのクラス図からActiveScaffoldのコードを自動生成する

Jude/LuRuJu/JRuby/ERBを用いたActiveScaffoldのソース自動生成プログラム

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/12/25 00:00
目次

ジェネレータの使い方

 上記のように「JRuby\bin」にパスが通っており、LuRuJuがインストールされており、Judeのjarファイル2つにクラスパスが設定されていると、ジェネレータを使用することができます。最初にJudeでクラス図を書いてみます。

クラス図(dbm_sample.jude)
クラス図(dbm_sample.jude)

 このjudeファイルを読み込んでActiveScaffoldの各種ソースやデータベース定義を生成するには、下記のコマンドを実行します。ちなみに、「dbm_sample.jude」は皆さんの環境に合わせてフルパスで記述してください。

>jruby scaffold_generator.rb c:\rubysample\luruju\dbm_sample.jude

 これで、Judeのクラス図にミスがなければ各種のActiveScaffold用のファイルが自動生成されたはずです。このファイルを、後述するようにActiveScaffoldのインストールされたプロジェクトに配置するだけで、関連付きのActiveScaffoldアプリケーションが出来上がります。

 なお、本アプリケーションを実行するときは、読み込むjudeファイルをJudeで開いているとエラーがでるため、実行前にJudeを停止させておくとよいでしょう。

クラス図を書くルール

 このアプリケーションで自動生成できる対象範囲は、あまりカスタマイズする必要がないようなアプリケーションで、ある程度の見た目であり、モデル間の関連もメンテナンスできるようなレベルのアプリケーションです。

 いわゆるマスタメンテ系は関連も併せてこのアプリケーションで事足りるかもしれません。しかし、複雑でカスタマイズが必要になってくるものはRailsで一から作った方が速いでしょう。

 Judeで作ったクラス図からアプリケーションを作成する制約に伴い、このジェネレータでアプリケーションを生成したい場合、クラス図を描くルールがいくつか存在する。

  1. 基本はクラス名、属性名に日本語を使用し、別名に英語名を記入しておくこと。クラス名は単数型を用いる。
  2. 関連もロール名を記入することができる。名前に日本語を使うことができ、別名に英語名を書いておく。
  3. クラス名や関連のロール名が英語の場合は、別名なしでクラス名やロール名を記述してもよい。
  4. 1対1の関連の時に関連の定義に[active_record_key]と書いておくと、書いてある方のクラスに相手方クラスのidが挿入されるようになる。
  5. 関連名を省略すると、相手先のクラスの名前が関連名になる。

 クラス図のルールは、これだけです。現在は継承には対応していませんが、1対1、1対多、多対1、多対多のすべての多重度に対応しています。

 次に、これらの設定がどうアプリケーションに生かされるかを説明します。

クラス図のアプリケーションへの反映

クラスとテーブル

 次に、クラス図とER図の対応を見てみましょう。このジェネレータでは、データベースの表の作成は、表に対するマイグレーションファイルの生成で実現されます。

 クラスとテーブルの大きな違いとしては、主キーと外部キーの付与、および関係テーブルの3つに集約されます。他には、クラス名が単数型なのに対して、テーブルは複数型になる点が異なります。

 まず主キーですが、テーブルにはidという名前のプライマリキー項目が必要になります。これはマイグレーションファイルで自動的に生成されます。

 次に外部キーは、1対多関連の場合には、多の方に相手側の主キーが追加されます。例えば会社とメンバは1対多ですが、メンバのほうのテーブルにcompany_idが追加されています。

 1対1のテーブルの場合は、どちらかの表に相手側のクラス名のidを埋め込む必要がありますが、関連の定義に[active_record_key]という記述を入れておくと、そちら側のクラスを表すテーブルにキーが付与されます。

 また、多対多の関連の場合、「クラス名1複数型_クラス名2複数型」の名前で作成されます。例えば、メンバとバンドは多対多なのでbands_members表になります。bandとmemberがどちらが先に来るかは、アルファベットの昇順で決定しています。

 型の変更も存在します。私的なアプリケーションなのでアプリケーション内部に埋め込んでいますが、属性の型(Stringintなど)に対応させた形で内部で変換しています。この変換を増やしたければコードに1か所追加してください。

@@type_convert_hash = {"String" => "string",
                       "int" => "integer",
                       "Integer" => "integer",
                       "Date" => "date"}

 テーブル生成の結果はマイグレーションファイルとして作成され、連番が付与されます。

クラス図とマイグレーションファイルの対応づけ
クラス図とマイグレーションファイルの対応づけ

 マイグレーションファイルができたら「%RailsRoot%\db\migration」に配置して、

rake db:migrate

 とタイプすると、データベースの表が出来上がります。

クラスとモデル

 これは単純ですが、クラスに対応するモデルを見てみましょう。

クラス図とモデルの対応付け
クラス図とモデルの対応付け

 クラス図の別名(別名がなければクラス名)でクラスが作成されます。1対1、1対多、多対多それぞれに合わせて関連の設定が追加されています(belongs_toなどの個所です)。

 関連の対応は下記の通りです。

employeeとdivisionの例
関連division.rbemployee.rb
division1対1employeehas_one :employeebelongs_to :division
division1対多employeehas_many :employeesbelongs_to :division
division多対多employeehas_and_belongs_to_many :employeeshas_and_belongs_to_many :divisions

 1対1の場合、どちらをbelongs_toにするか決定する必要があります。クラスのモデルの関連の「定義」に[active_record_key]という文字列を入れておくと、そちらの関連端がbelongs_to、つまり対応するデータベースに相手クラスのプライマリキーが埋め込まれることになります。

クラスとコントローラ

クラス図とコントローラの対応付け
クラス図とコントローラの対応付け

 コントローラも、モデルごとに作成されます。active_scaffoldという行で、コントローラで管理するモデル名を指定します。config.columnsの行でこのアプリケーションで使用する項目名を指定します。項目名はクラスの属性だけではなく、使用する関連も指定する必要があります。これらの属性には、自分で作ったメソッドも指定することができます。

 また、画面の項目名に日本語を付けると思うので、クラスの属性のラベルの定義を日本語で行います。

 ActiveScaffoldを使うと、この設定だけで画面をもったアプリケーションが作成されます。

クラスとビューテンプレート

 後は「%RailsRoot%\app\view\layout」で、コントローラごとにviewのテンプレートを作成する必要があります。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>バンド管理</title>
<%= javascript_include_tag :defaults %>
<%= active_scaffold_includes %>
</head>
<body>
<%= yield %>
</body>
</html>

 ここでは<title></title>の部分だけ、コントローラの管理するアプリケーション名を設定する必要があるので、モデルクラス名+管理という名前をつけて自動生成されます。

 なお、既存のActiveScaffoldの画面を変更したい場合は、

%RailsRoot%\vendor\plugins\active_scaffold\frontends\default\views

 にある、テンプレートを「%RailsRoot%\app\views\コントローラ名」(employeeなどcontrollerはカットして名付ける)のディレクトリにコピーして修正すれば、特定のビューを変えることができます。

 このジェネレータが作成するソースファイルの解説は以上です。

生成されたソースの移動

 生成されたmodel、controller、view(layout)を「%RailsRoot%\app」配下のそれぞれのディレクトリに移動させ、migrationファイルは「%RailsRoot%\db\migrate」に移動させてください。

サーバーの起動

 「%RailsRoot%」のディレクトリで下記のコマンドをタイプすると、サーバが起動します

>ruby script/server

 サーバが起動したら、下記のURLでそれぞれのコントローラを持つアプリケーションが使えます

http://localhost:3000/controller名

ex. http://localhost:3000/band
    http://localhost:3000/member
    http://localhost:3000/company

 このサーバ環境への移動のロジックをコーディングするのも非常に簡単です。ぜひとも試してみてください。

アプリケーションとのマッピング

 完成されたアプリケーションとモデルの対応付けは以下の通りです。まず、一覧画面とクラス図を見比べてみます。

一覧画面とクラス図
一覧画面とクラス図

 この一覧画面は「メンバ」を主体にした一覧画面です。一覧の項目には「メンバ」の属性が並んでいます。その後、関連がある場合は関連の情報(バンドとか、会社とか)が続きます。関連が1であるか多であるかで、1行につきデータが1つなのか複数持てるかが変わります。

編集画面とクラス図
編集画面とクラス図

 編集画面の場合、まず主体となる「メンバ」の情報が編集可能になっており、関連のあるバンドや会社の情報を選択したり、新規に追加したりすることができます。これにより「メンバ」が所属する「会社」や「バンド」を設定することができます。

 ※現時点では、ActiveScaffoldのバグか、筆者の設定ミスかは分かりませんが、メンバからバンドの関連づけを行うと、余計な「バンド」オブジェクトが生成される不具合があります。
 バンド側の画面からメンバに関連をつける場合はこの問題は発生しません。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5