!Rails2.0.1での話

単体テスト関係の問題が解消されて、Generate したままでほぼ動くようになっている。単体テストに関するポイントは、

* Generator での仮定
** テーブル名は module_class名(複数)である
** 単体テストは module に対応するサブディレクトリ下に作り、module の下のクラスで作る。
* Fixture の前提
** (一般的な)fixture は fixtures 直下に、テーブル名をファイル名にして格納されている。
* Tips
** model を generate しただけでは、自動的にはクラスに set_table_name が記述されない。module_class(複数)という名前のテーブルでいい場合でも、自分で記述する必要がある。

!概要(内容古い)

models の下にフラットにクラスを入れるのではなく、整理して入れたいという要求がある。Rails的には、各フォルダがModuleに対応するのが良い。Rails 1.1系ですでにサポートされており、1.2系では Module に対応しないとサブフォルダ切りがうまく動かないらしいので、Moduleをつかったサブフォルダ切りをしてみたのだが、癖がある。以下、1.1.2においてのTipsをまとめる。

!!参考情報 - 単一テーブル継承のtype値

同じModule下にあるクラス間で継承関係をつくり、単一テーブル継承をしてみた。このとき、MyModule::Foo < MyModule::Base < ActiveRecord::Base となっていたとすると、Fooクラスでは単一テーブル継承テーブルの type カラムにはモジュールはつかず 'Foo' が入る。(MyModule::Baseクラスではnil)。

!!fixture

上記クラス関係において、テーブル名が my_module となっていて、base クラスに対応した fixture で全派生クラス分を一気に設定したかったのだが、単一テーブル継承の起点クラスと名前が違ったら、単純に以下のようにしてもだめだった。

 fixtures 'my_module/my_modules'

上記は基本的にfixtureファイルの位置とテーブル名として利用されるが、クラス名とテーブル名が対応しない場合は別途設定がいるようだ。
以下のようにするとうまくいった。

 fixtures 'my_module/my_modules'
 set_fixture_class  "my_module/my_modules".to_sym => 'my_module/base' 

クラス名のハッシュのキーは symbol である必要がある。

なお、Rails 2.0.2で、モジュール下のクラスのフィクスチャのロードをするには、[[「モジュール下のモデルのフィクスチャを扱うには」|http://www.everyleaf.com/tech/ror_tips/fixture_for_model_in_modules]]を参考にしてください。


!!セッションからのロード

my_module に対する const_missing を無限ループで処理しようとする問題にぶつかった。とりあえず、そもそもセッション保存量を減らしたいちおうこともあったので、module階層化された単一テーブル継承のクラスをセッションで保存しないようにして回避。

階層化したModel+単一テーブル継承(+私のコードのなにか?)で起きるくさい。