Ruby on Rails模型设计的最佳实践

8
RoR教程认为ORM需要每个表一个模型。 我的数据库架构将70个表概念上分为5组功能(例如,任何给定的表只存在于一个功能组中,并且不同组之间的表之间的关系是最小化的)。 那么:我应该为每个概念组设计一个模型,还是应该仅有70个Rails模型并保留“概念上”的分组?谢谢!
7个回答

10

很可能,您应该有70个模型。您可以将模型命名空间分为5个名称空间,每个组一个,但这可能会带来更多麻烦。更有可能的是,每个组都有一些共同的功能。在这种情况下,我会为每个组制作一个包含其行为的模块,并将其包含在每个相关模型中。即使没有共享功能,这样做也可以让您快速查询模型的概念组。


谢谢!突然间我明白了为什么我可能想要使用模块。去读一些更多的资料... - NickR

9

在我的一个大型应用程序中,我通过确保按名称将表/模型进行概念分组(具有几乎1:1的表-模型关系)来解决此问题。例如:

events
event_types
event_groups
event_attendees
etc...

这样当我使用TextMate或其他工具时,模型文件会按字母顺序进行良好的分组。我在这个应用程序中有80个模型,它足以保持事物有条不紊。

6

为了充分利用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

针对发布文章和评论的操作:

等等其他相关操作...


谢谢!子目录/命名空间是一个好的解决方案。Nick - NickR

4
不了解这七十个表的性质和它们之间的概念关系,很难给出一个好的答案。这些是遗留表还是你从头设计的?这些表是否通过某种继承模式相互关联?Rails可以实现有限的继承形式。请查阅Single Table Inheritance (STI)。个人而言,我会尽力避免与七十个表一起工作,因为那需要大量的工作——七十个模型和控制器及其4+视图、帮助程序、布局和测试,更不用说保持设计独立的内存负载问题了。除非我按小时计费并且获得足够高的报酬来弥补重复的工作。

4
在开始制作70个模型之前,请考虑以下问题以帮助您决定:
例如,“汽车”表,您的每个表是否都被视为“对象”,还是有些表仅包含关系信息,例如所有外键列?
在Rails中,只有“对象”表成为模型!(对于特定类型的关联有一些例外)因此,如果您只有5组功能,则很可能不会有70个模型。而且,如果您提到的功能组差异巨大,它们甚至可能最适合在自己的应用程序中。

1

在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

1

如先前所述,不了解您的数据库架构等情况很难给出合适的建议,但是我倾向于创建70多个模型(每个表一个模型)。

您可能可以放弃一些模型,但是考虑到成本(微不足道),最好还是将它们保留在那里。

您不需要为每个模型创建控制器+视图(如srboisvert所回答的)。您只需要为每个资源创建一个控制器(根据您的描述,这可能只有10或15个左右)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接