Rails应用程序中的命名空间模型

Fre*_*ies 7 ruby-on-rails rails-models

我最近和我的一个朋友讨论过,他也是一名RoR开发人员.我们争论如何管理Rails模型.我个人喜欢在默认命名空间中只留下根模型(例如User,Article,Bill等),并且依赖模型转到一个模块(例如User :: Profile,User :: Activity),其名称为root他们与之相关的模型.

另一方面,我看到许多项目在默认命名空间中有100个模型,如user_profile,user_activity等.从Java(Spring)开发来看,java社区倾向于在包中组织类并将它们逻辑分组,我觉得这很有吸引力.

所以问题是:在模块中对模型进行分组是否存在任何缺陷(除了额外的:关系定义中的class_name),是否存在人们通常不这样做的具体原因?

tad*_*man 4

尽管命名空间有其优点,但它确实需要在整个模型中添加例外。Foo::Bar 假定关联的表名称为barsbar_id,而您可能更喜欢使用foo_bars和来代替。foo_bar_id

如果您确实对此有强烈的感受,您可能想看看是否有一个附加组件可以为您解决这个问题,或者实现您自己的扩展。

我使用命名空间的唯一情况是在第三方应用程序中使用附加组件,我不想声明根级模型名称,因为这会很烦人。在这种情况下,额外的努力是值得的。

如果您对看到 100 多个没有任何分组的模型文件感到烦恼,那么您可能也会对看到 100 多个没有分组的表感到烦恼,而这通常是您无法修复的问题。

控制器可以很自然地进行分组,但模型并不那么容易适应,至少对于现有的 ActiveRecord 来说是这样。

  • 我通常采用使用前缀作为一种命名空间的方法,因此您可以创建 UserProfile 和 UserActivity 等内容,而不是 Profile 或 Activity。这导致了列表中的自然分组。很少有一个拥有 500 多个模型的应用程序能够从命名空间中获益匪浅。复杂就是复杂。有时,诚实地了解应用程序的复杂程度比试图通过隐藏复杂性并让查找内容变得更加困难来假装它实际上很简单更好。 (7认同)
  • 我不记得上次打开数据库资源管理器是什么时候了。对于 Ruby 来说,抽象这些东西是很自然的。据我记得,Foo::Bar 将生成一个“foo_bar”表。唯一的缺点是您必须在关联中指定 :class_name => Foo::Bar 。我想知道如果 Rails 应用程序鼓励将所有模型保留在一个目录中,那么它应该如何处理复杂的应用程序。我的意思是,如果应用程序增长太多,命名空间是所需重构的一部分还是只是切换到 Java?) (2认同)