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

Ruby on rails RubyonRails中模型设计的最佳实践,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,RoR教程为ORM的工作假设每个表一个模型。 我的DB模式有大约70个表,从概念上分为5组功能 (例如,任何给定的表都存在于一个且仅存在于一个功能组中,不同组的表之间的关系最小化。) 那么:我应该为每个概念组设计一个模型,还是应该只设计70个Rails模型,而将分组保留为“概念”呢? 谢谢 最有可能的是,您应该有70个型号。您可以为模型命名为5个名称空间,每个组一个,但这可能会带来更多麻烦。更有可能的是,您在每个组中都有一些共同的功能。在这种情况下,我将为每个组创建一个包含其行为的模块,并将其包

RoR教程为ORM的工作假设每个表一个模型。 我的DB模式有大约70个表,从概念上分为5组功能 (例如,任何给定的表都存在于一个且仅存在于一个功能组中,不同组的表之间的关系最小化。) 那么:我应该为每个概念组设计一个模型,还是应该只设计70个Rails模型,而将分组保留为“概念”呢?
谢谢

最有可能的是,您应该有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提供的干燥度。但是,如果没有意义,请使用每个表的类

在每个表的类版本中,您不能轻松地将公共功能拉入基类。相反,将其拉入模块中。类似于以下的层次结构可能很有用:

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个表的性质及其概念关系的细节,就不可能给出一个好的答案。这些是旧表还是您从头设计的

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


就我个人而言,我会花很多精力避免使用70个表,因为这是一项非常艰巨的工作——70个模型和控制器及其4+视图、助手、布局,还有测试,更不用说将设计保留在ind中的内存负载问题。当然,除非我是按小时计酬的,并且足够好地补偿重复。

已经提到过,如果不知道数据库模式等,很难给出合理的建议,但是,我倾向于创建70多个模型,(每张桌子一张。)

你也许可以放弃一些型号,但为了成本(负责任),你也可以把它们放在那里


你不需要为每个模型创建一个控制器+视图(如SRBOISISVT的回答)。你只需要每个资源的一个控制器(我希望它少于70个-大概只有10个或15个左右根据你的描述来判断)。

< P>在制作70个模型之前,请考虑这个问题来帮助你决定:

您的每个表是否都被视为“对象”,例如“cars”表,或者某些表是否只包含关系信息,例如所有外键列


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

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

events
event_types
event_groups
event_attendees
etc...

这样,当我使用TextMate或其他工具时,模型文件按alpha排序很好地组合在一起。我在这个应用程序中有80个模型,它工作得很好,足以使事情井然有序。

谢谢!突然我明白了为什么我可能要使用模块。去做更多的阅读..谢谢!子目录/名称空间是一个很好的解决方案n、 尼克