RoR教程认为ORM需要每个表一个模型。
我的数据库架构将70个表概念上分为5组功能(例如,任何给定的表只存在于一个功能组中,并且不同组之间的表之间的关系是最小化的)。
那么:我应该为每个概念组设计一个模型,还是应该仅有70个Rails模型并保留“概念上”的分组?谢谢!
很可能,您应该有70个模型。您可以将模型命名空间分为5个名称空间,每个组一个,但这可能会带来更多麻烦。更有可能的是,每个组都有一些共同的功能。在这种情况下,我会为每个组制作一个包含其行为的模块,并将其包含在每个相关模型中。即使没有共享功能,这样做也可以让您快速查询模型的概念组。
在我的一个大型应用程序中,我通过确保按名称将表/模型进行概念分组(具有几乎1:1的表-模型关系)来解决此问题。例如:
events
event_types
event_groups
event_attendees
etc...
为了充分利用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提供的DRYness。但是当它没有意义时,请使用每个表对应一个类。
在每个表对应一个类的版本中,您无法轻松地将常见功能提取到基类中。而是将其提取到模块中。以下层次结构可能会证明有用:
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所回答的)。您只需要为每个资源创建一个控制器(根据您的描述,这可能只有10或15个左右)。