Ruby on Rails中的模型设计最佳实践
RoR教程为每个表假定一个模型,以便ORM可以工作。
我的数据库模式有大约70个表,从概念上讲分为5组功能
(例如,任何给定的表都位于一个功能组中,并且最小化不同组的表之间的关系。)
因此:我应该为每个概念组设计一个模型,还是只拥有70个Rails模型并让该组保持"概念性"?
谢谢!
解决方案
回答
我们很可能应该有70个模型。我们可以为模型命名空间以拥有5个命名空间,每个命名空间一个,但这样做可能会带来更多麻烦。我们更有可能在每个组中都有一些通用功能。在这种情况下,我将为每个组创建一个包含其行为的模块,并将其包含在每个相关模型中。即使没有共享功能,执行此操作也可以使我们快速查询模型的概念组。
回答
为了充分利用所有ActiveRecord的魔力,我们绝对应该为每个表使用一个模型。
但是我们也可以使用模块和子目录将模型分组到命名空间中,以避免必须管理models目录中的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标准的单表继承模型。可能一个特定功能组中的所有类都具有相同的字段(或者几乎全部相同)。在这种情况下,请利用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
回答
如果不了解有关七十张桌子的性质及其概念关系的更多详细信息,实际上不可能给出一个好的答案。这些是旧表还是我们是从头开始设计的?
这些表是通过某种继承模式关联的还是可以的? Rails可以进行有限形式的继承。查找单表继承(STI)。
就我个人而言,我会避免使用七十张表,这是因为七十个模型和控制器及其4+视图,助手,布局和测试的工作量很大,更不用说保持它的内存负载了工业设计。当然,除非我按小时获得报酬,而且足以补偿重复。
回答
已经提到过,在不知道数据库架构等情况下很难给出像样的建议,但是,我倾向于创建70多个模型(每个表一个)。
我们也许可以摆脱一些模型,但是出于成本(微不足道)的考虑,我们也可以在那里购买它们。
我们无需为每个模型创建一个控制器+视图(由srboisvert回答)。对于每个资源,我们只需要一个控制器(根据描述,我希望它比70少很多,可能只有10或者15个左右)。
回答
在制作70个模型之前,请考虑以下问题以确定:
是将每个表都视为"对象"(例如" cars"表),还是将某些表仅包含关系信息(例如所有外键列)?
在Rails中,只有"对象"表成为模型! (对于某些特定类型的关联,有一些例外)因此,如果只有5组功能,则很可能没有70个模型。此外,如果我们提到的功能组有很大不同,它们甚至可能最适合于自己的应用程序。
回答
我只是通过确保表/模型在概念上按名称分组(几乎具有1:1的表-模型关系)来在一个大型应用程序中进行介绍。例子:
events event_types event_groups event_attendees etc...
这样,当我使用TextMate或者其他工具时,模型文件会按alpha排序很好地分组在一起。我在这个应用程序中有80个模型,它运作良好,可以使事情井井有条。