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


79

可能会有这样的事情吗?

app/models/
app/models/users/user.rb
app/models/users/education.rb

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

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

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


我知道您不想要名称空间,但是我认为做到这一点的最佳方法是使用ActiveSupport Concerns。
Nando Sousa

2
@NandoSousa。否。ActiveSupport关注的是共享行为。您使用模型的方式。
berkes 2015年

Answers:


115

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

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

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

或者,如果您有一个更复杂的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>")

Rails 4.1+的更新

从Rails 4.1开始,config.autoload_paths默认情况下不包含应用生成器。因此,请注意,以上内容确实属于config / application.rb

更新

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


6
尝试了它,但失败了,因为无法自动加载常量User :: Credits,需要/srv/books/app/models/user/credits.rb来定义它。因此,仍然不需要命名文件。按照建议将它们放在lib条目上方。
Rubytastic

1
这个错误实际上是个好消息。这意味着它找到了文件。但是,您在这里使用了奇数复数。如果您的文件名是,请app/models/user/credits.rb确保文件中的类名也为复数:class Credits。但是,我建议使用Rails标准并使其class Credit与文件名相同app/models/user/credit.rb(模型应为单数)。无论哪种方式,这都应该是问题所在。让我知道!
pdobb

1
在Rails 4.1配置中,我使用config.autoload_paths += %W( #{Rails.root}/app/models/namespace #{Rails.root}/app/models/other_namespace )
Epigene

13
config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]可以但会降低应用程序的运行速度,特别是在经常重新加载应用程序的开发模式下。原因是您不能将所有文件都添加到autoload_paths中,而只能将根文件夹添加到其中可以推断出文件名和模块的位置。简单来说,如果模型中只有一个级别的子文件夹,而没有名称空间模型,则只能这样做config.autoload_paths += Dir[Rails.root.join('app', 'models', '*/')],仅添加第一级子目录。相同lib或其他路径。
muichkine 2015年

3
@pdobb的经验:)如果您查看自动加载的工作原理,您会发现它完全循环auto_loading_paths了,并为模型添加了推论。例如,如果有NameSpace::Model,它将尝试在所有autoloading_paths中找到a path/namespace/model。很明显,只有当path一个目录时,这才可以匹配。根据经验,您应该仅在目录中具有autoload_paths最大效率。希望能帮助到你。
muichkine 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.