【问题标题】:Best Practice for Model Design in Ruby on RailsRuby on Rails 中模型设计的最佳实践
【发布时间】:2010-09-08 22:01:46
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

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

    events
    event_types
    event_groups
    event_attendees
    etc...
    

    这样,当我使用 TextMate 或其他任何东西时,模型文件会按 alpha 排序很好地组合在一起。我在这个应用中有 80 个模型,它运行良好,足以让事情井井有条。

    【讨论】:

      【解决方案2】:

      已经提到过,如果不了解您的数据库架构等,很难给出体面的建议,但是,我倾向于创建 70 多个模型(每个表一个。)

      您可以放弃某些模型而侥幸逃脱,但考虑到成本(可忽略不计),您不妨将它们放在那里。

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

      【讨论】:

        【解决方案3】:

        在开始制作 70 个模型之前,请考虑以下问题以帮助您做出决定:

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

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

        【讨论】:

          【解决方案4】:

          如果不了解有关这 70 个表的性质及其概念关系的更多详细信息,实际上不可能给出一个好的答案。这些是旧表还是您从头开始设计的?

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

          就个人而言,我会付出很多努力来避免使用 70 个表,因为那是一项非常大量的工作——70 个模型和控制器以及它们的 4 多个视图、帮助器、布局和测试,更不用说内存负载了保持设计的问题。当然,除非我按小时获得报酬,并且足以弥补重复。

          【讨论】:

            【解决方案5】:

            在少数情况下,您可以使用 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
            

            【讨论】:

              【解决方案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
              

              对于 Publishing::Article 和 Publishing::Comment

              等等……

              【讨论】:

              • 谢谢!子目录/命名空间是一个很好的解决方案。尼克
              【解决方案7】:

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

              【讨论】:

              • 谢谢!突然间我明白了为什么我可能想要使用模块。继续阅读。
              猜你喜欢
              • 2011-09-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-06-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多