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

时间:2008-09-15 12:52:16

标签: ruby-on-rails ruby activerecord

RoR教程为每个表提供一个模型,以便ORM工作。 我的数据库架构有大约70个表,从概念上划分为5组功能 (例如,任何给定的表存在于一个且仅存在一个功能组中,并且不同组的表之间的关系被最小化。) 那么:我应该为每个概念组设计一个模型,还是应该只有70个Rails模型并让分组“概念化”? 谢谢!

7 个答案:

答案 0 :(得分:10)

最有可能的是,你应该有70个型号。您可以将模型命名为5个名称空间,每个组一个,但这可能比它的价值更麻烦。更有可能的是,您在每个组中都有一些共同的功能。在这种情况下,我会为包含其行为的每个组创建一个模块,并将其包含在每个相关模型中。即使没有共享功能,执行此操作也可以让您快速查询模型的概念组。

答案 1 :(得分:8)

我在一个大型应用程序中介绍了这一点,只需确保表格/模型在概念上按名称分组(几乎是1:1的表格 - 模型关系)。例如:

events
event_types
event_groups
event_attendees
etc...

当我使用TextMate或其他任何东西时,模型文件通过alpha排序很好地组合在一起。我在这个应用程序中有80个模型,它运行良好,可以保持组织有序。

答案 2 :(得分: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

for Publishing ::文章和出版::评论

等等......

答案 3 :(得分:4)

如果不了解有关七十张桌子的性质及其概念关系的更多细节,那么就不可能给出一个好的答案。这些遗留表是你从头开始设计的吗?

这些表是通过某种继承模式相关的还是可以的? Rails可以进行有限的继承。查找单表继承(STI)。

就个人而言,我会花费大量精力避免使用70个桌子,因为这是一项非常多的工作 - 七十个模型和控制器及其4个以上的视图,帮助器,布局和测试,更不用说将设计保持在ind中的内存负载问题。当然,除非我按小时获得报酬,并且足以弥补重复。

答案 4 :(得分:4)

在制作70个模特之前,请考虑这个问题来帮助您做出决定:

您的每个表都会被视为“对象”,例如“cars”表,还是只包含关系信息的一些表,例如所有外键列?

在Rails中只有“对象”表成为模型! (对于特定类型的关联有一些例外)因此,如果您只有5组功能,则很可能没有70个模型。此外,如果您提到的功能组大不相同,它们甚至可能最适合自己的应用程序。

答案 5 :(得分:1)

可能有少数情况可以使用Rails标准单表继承模型。也许一个特定功能组中的所有类都具有相同的字段(或几乎完全相同)。在这种情况下,请利用DRYness STI提供的优惠。但是,如果没有意义,请使用class-per-table。

在每个类的类中,您无法轻松地将常用功能引入基类。相反,将其拉入模块。如下所示的层次结构可能有用:

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

答案 6 :(得分:1)

已经提到过,在不知道您的数据库架构等情况下很难提供正确的建议,但是,我倾向于创建70多个模型,(每个表格一个)。

你可能可以放弃一些模型,但是为了成本(可以忽略不计),你可以将它们放在那里。

您不需要为每个模型创建控制器+视图(由srboisvert回答)。你只需要一个控制器用于每个资源(我希望它远远低于70 - 根据你的描述可能只有10或15左右)。