Ruby on Rails 中模型设计的最佳实践
-
09-06-2019 - |
题
RoR 教程为每个表提供一个模型,以便 ORM 工作。我的DB模式的大约70个表在概念上分为5组功能(例如,任何给定的表格都属于一个功能组,而不同组的表之间的关系被最小化了。)因此::我应该为每个概念组设计一个模型,还是应该只拥有 70 个 Rails 模型并保留分组“概念”?谢谢!
解决方案
我在我的一个大型应用程序中介绍了这一点,只需确保表/模型在概念上按名称分组(具有几乎 1:1 的表模型关系)。例子:
events
event_types
event_groups
event_attendees
etc...
这样,当我使用 TextMate 或其他工具时,模型文件会按 alpha 排序很好地分组在一起。我在这个应用程序中有 80 个模型,它运行良好,足以让一切井井有条。
其他提示
最有可能的是,您应该有 70 个模型。您可以将模型命名为具有 5 个命名空间,每个组一个,但这可能会带来更多麻烦。更有可能的是,每个组都有一些共同的功能。在这种情况下,我将为每个组创建一个包含其行为的模块,并将其包含在每个相关模型中。即使没有共享功能,这样做也可以让您快速查询模型的概念组。
您绝对应该为每个表使用一个模型,以便充分利用 ActiveRecord 的所有魔力。
但您也可以使用模块和子目录将模型分组到命名空间中,以避免管理模型目录中的 70 个文件。
例如,您可以:
app/models/admin/user.rb
app/models/admin/group.rb
对于模型 Admin::User 和 Admin::Group,以及
app/models/publishing/article.rb
app/models/publishing/comment.rb
用于发布::文章和发布::评论
等等...
如果不了解有关七十张桌子的性质及其概念关系的更多细节,就不可能给出一个好的答案。这些是旧表还是您从头开始设计的?
这些表是否通过某种继承模式相关?或者它们可能是吗?Rails 可以进行有限形式的继承。查找单表继承 (STI)。
就我个人而言,我会付出很大的努力来避免使用 70 个表,因为这是一项巨大的工作量 - 70 个模型和控制器以及它们的 4 个以上视图、帮助器、布局和测试,更不用说保持的内存负载问题ind 中的设计。当然,除非我按小时付费并且足够好以弥补重复。
在开始制作 70 个模型之前,请考虑这个问题以帮助您做出决定:
您的每个表是否都被视为“对象”(例如“汽车”表),或者某些表仅保存关系信息(例如所有外键列)?
在 Rails 中,只有“对象”表才成为模型!(特定类型的关联有一些例外)因此,如果您只有 5 组功能,则很可能没有 70 个模型。此外,如果您提到的功能组差异很大,它们甚至可能最适合自己的应用程序。
在少数情况下,您可以使用 Rails 标准单表继承模型。也许一个特定功能组中的所有类都具有相同的字段(或几乎全部相同)。在这种情况下,请利用 DRYness STI 优惠。但是,当它没有意义时,请使用每表类。
在每表类版本中,您无法轻松地将通用功能拉入基类中。相反,将其拉入模块中。像下面这样的层次结构可能会很有用:
app/models/admin/base.rb - module Admin::Base, included by all other Admin::xxx
app/models/admin/user.rb - class Admin::User, includes Admin::Base
app/models/admin/group.rb - class Admin::Group, includes Admin::Base
已经提到过,在不了解数据库架构等的情况下很难给出像样的建议,但是,我倾向于创建 70 多个模型(每个表一个)。
你也许可以放弃一些模型,但为了成本(可以忽略不计),你最好还是把它们放在那里。
您不需要为每个模型创建控制器+视图(如 srboisvert 所回答)。您只需要为每个资源配备一个控制器(我预计该数量将远少于 70 个 - 根据您的描述判断,可能只有 10 或 15 个左右)。