3

Rails 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

私のレールコンソールでは、アクティブレコードの関連付けを除いて、絶対参照を持つすべてのモデルで機能します。Listing.first.communications を呼び出すことができません。Listing::Communication を読み込もうとしているのがわかりますが、このファイルの内容が Communication (名前空間なし) であるため失敗しました。

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

モデルをディレクトリにグループ化し、名前空間なしで使用する方法はありますか? または、Rails がオンザフライでモデルをロードしないように、すべてのモデルをプリロードする方法はありますか?

4

2 に答える 2

5

Rails 3 のサブディレクトリとアソシエーションのモデルには問題があります。私もこれに出くわしました。

私の解決策は、サブディレクトリ内のモデルへのすべての関連付けに対して明示的な :class_name を指すことでした。

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

モデル名の前に「::」を使用していることに注意してください。これは、通信モデルの名前空間がないことをレールに伝えます。

于 2012-04-23T12:45:40.240 に答える
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
于 2012-07-26T18:11:41.553 に答える