Moduleの中にあるModelクラスの扱い

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で、モジュール下のクラスのフィクスチャのロードをするには、「モジュール下のモデルのフィクスチャを扱うには」を参考にしてください。

セッションからのロード

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

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

Last modified:2020/06/12 18:49:09
Keyword(s):
References:[Ruby on Rails]