2011-01-07 11 views
31

私のレールアプリケーションには100以上のモデルがあり、組織のために、私はそれらをフォルダに分割しています。すべてメインモデルフォルダの下にあります。プロジェクトを簡単にナビゲートし、関連するファイル。モデルをディレクトリに分割するのは悪い考えですか?

これは悪い考えですか?これを行う方法は何ですか?

+0

100以上のモデルはありますか?それは大きなプロジェクトですか? –

答えて

62

いいえ、それは悪い考えではありません。多くの人々がそれを行い、私は大規模なアプリケーションでそれなしでは生きられませんでした。

最初は自分のモデルを移動することです:

はそれを行うための2つの方法があります。しかし、あなたがどこにいるのかわからないので、道のりのモデルをロードするようにRailsに指示する必要があります。このようなものは、このトリックを行うべきです:

# In config/application.rb 
module YourApp 
    class Application < Rails::Application 
    # Other config options 

    config.autoload_paths << Dir["#{Rails.root}/app/models/*"] 
    end 
end 

最初の方法は簡単ですが、実際には最良の方法ではありません。第二の方法は、彼らがしているグループとモデルを名前空間をを必要とする。これは、代わりにUserUserGroupUserPermissionsを有するので、あなたがUserUser::GroupUser::Permissionを有することを意味します。

これを使用するには、rails generate model User::Groupのようなモデルを生成します。 Railsは自動的にすべてのフォルダを作成します。

class User < ActiveRecord::Base 
    belongs_to :group # Rails will detect User::Group as it's in the same namespace 
end 

class User::Group < ActiveRecord::Base 
    has_many :users 
end 

あなたが好きなあなたは、名前空間のしかし、多くのレベルを指定することができますので、User::Group::Permissionは次のようになります。追加の利点は、このアプローチで、名前空間内組合のためにフルモデル名を綴るする必要がないということです可能。

+0

app/modelsが既に存在するので、サブディレクトリをロードパスに追加する必要はありません。 'User :: Group'のようなネストされたモデルを参照することにより、Railsはこれらのパスを調べることで自動的にロードします。すべての 'app'定数はプロダクションモードで読み込まれます。 –

+0

@ Ryanはい、モデルのネームスペースを使用している場合は可能です。あなたが*ネームスペースしないが、それらをサブフォルダに入れて、 'configにパスを追加しないでください。 autoload_paths'を実行すると、ロードされません。 – vonconrad

16

100モデルの場合、実質的に要件です。 100台のモデルは1つのディレクトリに騒々しいです。

スクリプトの出力を見て、生成されたファイルを閲覧レールウェイ(tm)の

rails new MultiDirectoryExample 
cd MultiDirectoryExample 
rails generate scaffold User::Photo description:string 

のアイデアを得るためにこれを試してみてください。

関連する問題