Rails 4:在子路径中组织rails模型而不使用命名空间模型?

Rub*_*tic 74 namespaces ruby-on-rails models subdirectory ruby-on-rails-4

有没有可能有这样的东西?

app/models/
app/models/users/user.rb
app/models/users/education.rb
Run Code Online (Sandbox Code Playgroud)

目标是更好地组织/ app/models文件夹,但不必命名模型.

Rails 3的一个悬而未决的问题是: Rails 3.2.9和子文件夹中的模型.

使用命名空间指定table_name似乎可行(请参阅Rails 4模型子文件夹),但我想在没有命名空间的情况下执行此操作.

pdo*_*obb 108

默认情况下,Rails不会将models目录的子文件夹添加到自动加载路径.这就是它只能找到命名空间模型的原因 - 命名空间照亮了要查看的子目录.

要将app/models的所有子文件夹添加到自动加载路径,请将以下内容添加到config/application.rb:

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

或者,如果您有一个更复杂的app/models目录,上面将app/models的所有子文件夹组合在一起的方法可能无法正常工作.在这种情况下,您可以通过更明确地解决这个问题,并且只添加您指定的子文件夹:

config.autoload_paths += Rails.root.join("app", "models", "<my_subfolder_name1>")
config.autoload_paths += Rails.root.join("app", "models", "<my_subfolder_name2>")
Run Code Online (Sandbox Code Playgroud)

更新Rails 4.1+

从Rails 4.1开始,config.autoload_paths默认情况下不包括应用程序生成器.所以,请注意,上面确实属于config/application.rb.

UPDATE

修复了上面代码中使用的自动加载路径示例{*/}而不是{**}.请务必阅读muichkine的评论以获取详细信息.

  • `config.autoload_paths + = Dir [Rails.root.join('app','models','{**}')]`有效,但会降低应用程序的速度,特别是在经常重新加载应用程序的开发模式下.原因是您不能将所有文件添加到autoload_paths,而只能添加根文件夹,然后可以从中推断出文件名和模块.简单来说,如果你只有一个级别的子文件夹进入模型而没有命名空间模型,你应该只做`config.autoload_paths + = Dir [Rails.root.join('app','models','*/') ]`只添加第一级子目录.对于`lib`或其他路径也是如此. (12认同)
  • 试了但是它失败了,无法自动加载常量User :: Credits,期望/srv/books/app/models/user/credits.rb来定义它.所以它仍然不是文件间隔名称.按照建议将它们放在lib条目上方. (4认同)
  • @pdobb它的经验:)如果你看看自动加载是如何工作的,你会看到它在所有`auto_loading_paths`上循环,它为模型添加推理.例如,如果您有`NameSpace :: Model`,它将尝试在所有autoloading_paths中找到`path/namespace/model`.这显然只有在`path`是目录时才能匹配.根据经验,你应该只在`autoload_paths`中有目录以获得最大效率.希望能帮助到你. (3认同)