ここのところ Piece Framework とアイテマンではふたつの大移動が行われています。

ひとつはソフトウェア構成管理システムの Subversion から Git への移行です。こちらは「Subversion リポジトリを Git へ移行する」でも紹介しています。Git は考え方が難しく苦労していますが、リポジトリを作っては削除するということを繰り返しながら少しずつ理解を深めています。

もうひとつの大移動はプロジェクト管理ツールの移行です。

MATSUFUJI Hideharu

以前は Trac を使っていましたが、これを Redmine に移行しています。Redmine へ移行する最も大きな理由は複数のプロジェクトを管理する仕組みが充実しているからです。Piece Framework のプロダクト一覧を見ていただくとわかるように、私たちは今まで以上に細分化された小さなプロダクトを数多く管理する必要があります。これらのプロダクトを管理するためのツールとして、最初から複数のプロジェクトに対応している Redmine に移行することになりました。

文字数の制限にぶつかる

というわけで、Redmine に移行中なのですが、その過程で Redmine 0.8.2 では プロジェクトの名前は 30 文字まで、識別子は 20 文字までという制限がある ことがわかりました。Piece_UnityPiece_IDE などの主要なプロダクトの名称は短いので問題ないのですが、Piece_Unity のコンポーネントの多くは (例えば Piece_Unity_Component_Authentication) 30 文字を超えてしまいます。

こういった場合、最初に思いつくのは 文字数の制限内に収まるように省略する ということです。例えば、先ほどの Piece_Unity_Component_Authentication であれば、PUC_Authentication といった感じです。しかし、これはできれば避けたいところです。名称から意図が伝わるかどうかという観点から考えると 省略する というのは、明らかにマイナスです。

となると、制限自体を変更するしかありません。こうして、筆者は茨の道へと進んでいきます。(正確にいうと iteman によって茨の道へ投げ込まれているわけですが。)

ゴール

今回のゴールは以下のとおりです。プロジェクトの名前と識別子に加えて、長い Wiki のドキュメントが途切れてしまうのでそれも拡張したいと思います。

期待する振る舞い実際の振る舞い
プロジェクトの名前の長さ255 文字まで入力可能30 文字まで入力可能
プロジェクトの識別子の長さ255 文字まで入力可能30 文字まで入力可能
Wiki のテキストの長さ長いドキュメントでも入力可能長いドキュメントは途切れる

これらを期待する振る舞いになるようにするには、具体的に何を変更する必要があるかを調べました。

  • プロジェクトのテーブルのスキーマ
  • Wiki のテーブルのスキーマ
  • プロジェクトのモデルのバリデーション
  • プロジェクトのフォームのテンプレート

これらを順に変更していきたいと思います。

マイグレーションの作成と実行

まずはテーブルのスキーマから変更していきます。

RedmineRuby on Rails (以下、Rails) で実装されています。Rails にはデータベースのスキーマを管理する仕組みとして マイグレーション があります。詳しくは境界を越える: Rails のマイグレーションが参考になります。少し古い記事ですので、今はもっと効率の良い方法があるかもしれませんが、今回はこの記事を参考にしながらスキーマを変更していくことにします。

まず、マイグレーションを生成します。今回はプロジェクトの名前と識別子、Wiki のテキストと 3 つのフィールドを変更するために 3 つのマイグレーションを生成します。マイグレーションの名前に関しては、 db/migrate ディレクトリ以下にある他のマイグレーションを参考にしました。

ruby script/generate migration change_projects_name_limit
ruby script/generate migration change_projects_identifier_limit
ruby script/generate migration change_wiki_contents_text_to_mediumtext

以上のコマンドで db/migrate ディレクトリ以下に年月日時分秒をプリフィックスに持つマイグレーションが生成されます。

生成されたマイグレーションには up メソッドと down メソッドを持つクラスが記述されます。up メソッドで実施する変更を、down メソッドで元に戻す変更をそれぞれ記述します。

それぞれのマイグレーションは以下のとおりです。

db/migrate/20090324091719_change_projects_name_limit.rb
db/migrate/20090324091725_change_projects_identifier_limit.rb
db/migrate/20090324083927_change_wiki_contents_text_to_mediumtext.rb

今回は RDBMS に MySQL を使用しています。プロジェクトの名前と識別子については、:limit の値を 255 とすることで、実際のデータベーススキーマが varchar(255) にマッピングされます。Wiki のテキストは :text (最大 65,535 バイト) となっているところを :mediumtext (最大 16,777,215 バイト) に変更します。この部分は RDBMS に依存する部分なので、MySQL 以外の RDMBS では異なる変更が必要であったり、変更自体が不要かもしれません。

準備ができたらマイグレーションを実行します。

rake db:migrate RAILS_ENV=production

Redmine をインストールするときと同じコマンドですが、適用されていないマイグレーションのみが実行されるので問題ありません。

バリデーションとテンプレートにパッチを適用する

続いて、バリデーションとテンプレートを変更するパッチを作成します。これは単純にそれぞれの文字数を変更するだけです。

あとはパッチ適用対象の Redmine のソースツリーにパッチを適用するだけです。

Redmine の実装が悪いのか、Rails 自身の問題なのか判断がつかないのですが、文字数の制限を変更するためにモデル (バリデーション) とテンプレートのふたつのファイルを変更しなければならないのはちょっと残念な感じがします。

使用したソフトウェアのバージョン

Redmine0.8.2
Ruby on Rails2.1.2
MySQL5.0.51

参考文献

トラックバック(0)
  • このブログ記事のトラックバックURL:
コメント