【发布时间】:2010-09-08 22:01:46
【问题描述】:
RoR 教程假定每个表都有一个模型,以便 ORM 工作。 我的数据库模式有大约 70 个表,在概念上分为 5 组功能 (例如,任何给定的表都存在于一个且仅一个功能组中,并且不同组的表之间的关系被最小化。) 那么:我应该为每个概念组设计一个模型,还是应该简单地拥有 70 个 Rails 模型并保留分组“概念”? 谢谢!
【问题讨论】:
标签: ruby-on-rails ruby activerecord
RoR 教程假定每个表都有一个模型,以便 ORM 工作。 我的数据库模式有大约 70 个表,在概念上分为 5 组功能 (例如,任何给定的表都存在于一个且仅一个功能组中,并且不同组的表之间的关系被最小化。) 那么:我应该为每个概念组设计一个模型,还是应该简单地拥有 70 个 Rails 模型并保留分组“概念”? 谢谢!
【问题讨论】:
标签: ruby-on-rails ruby activerecord
我在我的一个大型应用程序中介绍了这一点,只需确保表/模型在概念上按名称分组(几乎 1:1 的表模型关系)。示例:
events
event_types
event_groups
event_attendees
etc...
这样,当我使用 TextMate 或其他任何东西时,模型文件会按 alpha 排序很好地组合在一起。我在这个应用中有 80 个模型,它运行良好,足以让事情井井有条。
【讨论】:
已经提到过,如果不了解您的数据库架构等,很难给出体面的建议,但是,我倾向于创建 70 多个模型(每个表一个。)
您可以放弃某些模型而侥幸逃脱,但考虑到成本(可忽略不计),您不妨将它们放在那里。
您不需要为每个模型创建控制器 + 视图(由 srboisvert 回答)。每个资源只需要一个控制器(根据您的描述,我预计它会少于 70 个 - 可能只有 10 或 15 个左右)。
【讨论】:
在开始制作 70 个模型之前,请考虑以下问题以帮助您做出决定:
您的每个表会被视为一个“对象”,例如“汽车”表,还是某些表只包含关系信息,例如所有外键列?
在 Rails 中,只有“对象”表才能成为模型! (特定类型的关联有一些例外)因此,如果您只有 5 组功能,您很可能没有 70 个模型。此外,如果您提到的功能组大不相同,它们甚至可能最适合自己的应用程序。
【讨论】:
如果不了解有关这 70 个表的性质及其概念关系的更多详细信息,实际上不可能给出一个好的答案。这些是旧表还是您从头开始设计的?
这些表是通过某种继承模式相关的还是可能是? Rails 可以进行有限形式的继承。查找单表继承 (STI)。
就个人而言,我会付出很多努力来避免使用 70 个表,因为那是一项非常大量的工作——70 个模型和控制器以及它们的 4 多个视图、帮助器、布局和测试,更不用说内存负载了保持设计的问题。当然,除非我按小时获得报酬,并且足以弥补重复。
【讨论】:
在少数情况下,您可以使用 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
【讨论】:
为了充分利用 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
对于 Publishing::Article 和 Publishing::Comment
等等……
【讨论】:
很可能,您应该有 70 个模型。您可以将模型命名为具有 5 个命名空间,每个组一个,但这可能比它的价值更麻烦。更有可能的是,您在每个组中都有一些共同的功能。在这种情况下,我会为每个包含其行为的组创建一个模块,并将其包含在每个相关模型中。即使没有共享功能,这样做也可以让您快速查询模型的概念组。
【讨论】: