Rails
ActiveRecord

モデルをサブディレクトリに分割する Rails 3.2

More than 5 years have passed since last update.

プロジェクトが大きくなるにつれて、モデルクラスの数もどんどん多くなる。収拾がつかなくなる前に、モデルをディレクトリにわけて置いておく方法をまとめる。

参考にした書籍は「エンタープライズRails」の第三章だけど、内容が古くそのままではうまく動かなかったので、検討してみた結果が以下。

まず、/app/models/以下に、好きなようにディレクトリを作り、適当にモデルファイルを配置する。例えば、/app/models/physical/users/ と /app/models/logical/のふたつのディレクトリを作り、それぞれuser.rbとrole.rbのモデルファイルを配置した。

さらに、User belongs_to Role として関連を設定する。


/app/models/physical/users/user.rb

class User < ActiveRecord::Base

belongs_to :role
#以下省略
end


/app/models/logical/role.rb

class Role < ActiveRecord::Base

attr_accessible :name
#以下省略
end

モデルの設定はこれでおしまい。

ただ、このままだとアプリの起動時にモデルの読み込みに失敗する。そこで、/config/application.rbにローディングの記述を追加する。

module YourAppName

class Application < Rails::Application
#18行目あたり
config.autoload_paths += %W(#{config.root}/app/models/logical)
config.autoload_paths += %W(#{config.root}/app/models/physical/users)
end
end

これですべて上手くいった。

-

ちなみに、書籍やブログで調べると、モデルクラスにはモジュールでラップし、関連の設定にはクラスのパスを明示的に知らせる必要があるというものがほとんどだったが、どれもうまくいかなかった。こんな感じ。

※これはうまくいかなかった設定です

module Physical
module users
class User < ActiveRecord::Base
belongs_to :role, :class_name => '::Logical::Role'
#以下省略
end
end
end

上記は結局上手く行かず、モジュールでのラップも、関連を設定する際のパスの指定も不要のようだ。Rails3.2からそのあたりが楽チンになったのだろうか??

どなたか間違いがわかる方はご指摘ください!