Rails:将模型结构化为子文件夹而不创建子模块的优雅方式

seb*_*seb 61 activerecord ruby-on-rails

我的app/models文件夹中有很多模型.我想稍微清理一下这个文件夹.在子文件夹中移动彼此属于的模型.问题是按照惯例,模型类被命名为相应的模块.

例如

app/models/blog/post.rb
app/models/blog/comment.rb
app/models/user.rb

以便:

应用程序/模型/博客/ post.rb

class Post < ActiveRecord
end
Run Code Online (Sandbox Code Playgroud)

并不是

class Blog::Post < ActiveRecord
end
Run Code Online (Sandbox Code Playgroud)

Ion*_*Br. 82

这是我用于Rails 3的内容:

config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]
Run Code Online (Sandbox Code Playgroud)

此配置告诉Rails递归扫描所有app/models子文件夹并加载所有找到的模型.不需要命名空间.

  • 这对我来说不是递归的.相反,我使用:Dir [Rails.root.join('app','models','**/')] (19认同)

Til*_*dor 12

我们需要这样做,而且有一种非常简单的方法.

将模型移动到子文件夹中,然后告诉rails从environment.rb文件中的所有子文件夹加载文件:

config.load_paths += Dir["#{RAILS_ROOT}/app/models/*"].find_all { |f| File.stat(f).directory? }
Run Code Online (Sandbox Code Playgroud)

不需要命名空间,并且可以在您的应用中将模型称为正常模型

  • 这适用于Rails 3.修改config/application.rb:将app/models/<dir>添加到autoload_paths - 不需要命名空间 (3认同)

seb*_*seb 0

在找到更好的解决方案之前,我在 app/models 文件夹中创建了一个 init.rb :

应用程序/模型/init.rb

%w[blog].each do |folder|
  path = [File.dirname(__FILE__), folder, "*.rb"].join('/')
  Dir[path].each {|file| require file }  
end
Run Code Online (Sandbox Code Playgroud)

直到现在才达到目的。