3

我正在使用具有 100 多个模型的 rails 3.2.3。问题是目录 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

在我的 rails 控制台中,它适用于任何具有绝对引用的模型,除了 activerecord 关联。我不能调用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

注意在模型名称前使用“::”——它告诉 rails 通信模型没有命名空间。

于 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 回答