LoginSignup
18
14

More than 5 years have passed since last update.

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

Posted at

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

参考にした書籍は「エンタープライズ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からそのあたりが楽チンになったのだろうか??

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

18
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
14