!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+単一テーブル継承(+私のコードのなにか?)で起きるくさい。