2012-04-23 10 views
3

私はレールモデル3.2.3と100以上のモデルを使用しています。ディレクトリapp/modelsがあまりにも混雑しているということです。私はいくつかのグループにディレクトリを編成し、autoload_paths(新しいサブディレクトリ用)を追加しました。私はモデルがネームスペースを使うことを望んでいません。なぜなら、ネームスペースがいくつかの名前空間になり、開発には向いていないからです。 さんが言ってみましょう:私のレールコンソールで名前空間のアクティブレコードモデルを避けるには?

# app/models/listing.rb 
class Listing < ActiveRecord::Base 
    has_many :communications 
end 

# app/models/listing/communication.rb 
class Communication < ActiveRecord::Base 
end 

、それはActiveRecordの団体を除き、絶対参照との任意のモデルで動作します。私はList.first.com通信を呼び出すことはできません。私はそれがList :: Communicationをロードしようとしているのを見て、このファイルの内容がCommunication(ネームスペースなし)であるために失敗しました。

LoadError: Expected /home/chamnap/my_app/app/models/listing/communication.rb to define Listing::Communication 

ディレクトリにグループ化モデルへの道と名前空間なしでそれらを使用はありますか?あるいは、すべてのモデルをあらかじめロードして、Railsがモデルをその場でロードしないようにする方法がありますか?

答えて

5

Rails 3のサブディレクトリとアソシエーションのモデルに問題があります。私もこの問題を抱えています。

私のソリューションは、明示的に指すようにした。使用したの

class Listing < ActiveRecord::Base 
    has_many :communications, :class_name => "::Communication" 
end 

テイク通知のように、サブディレクトリにモデル化するために、すべての関連付けCLASS_NAMEを「::」モデル名の前に - それは何があることをレールに言いませんコミュニケーションモデルの名前空間。

+0

ああ、ありがとう。私はactiverecordをチェックし、(compute_typeを使って)どのようにアソシエーションをロードするのかを見ていますが、これを忘れてしまいました。私はいくつかのブログを見て、それはデフォルトの動作だと言います。 – Chamnap

2
# e.g. subscription/coupon defines ::Coupon, would would blow up with expected coupon.rb to define Subscription::Coupon 
# to remove this: 
# a: namespace the models 
# b: move them to top-level 
# c: add :class_name => "::Coupon" to all places where they are used as associations 
ActiveRecord::Reflection::MacroReflection.class_eval do 
    def class_name_with_top_level 
    "::#{class_name_without_top_level}".sub("::::","::") 
    end 
    alias_method_chain :class_name, :top_level 
end 
関連する問題