【问题标题】:When to create a separate model as other class attribute in Rails?何时在 Rails 中创建一个单独的模型作为其他类属性?
【发布时间】:2017-05-01 12:47:33
【问题描述】:

我有一个“书”模型。 出版商名称类型(惊悚、恐怖、奇幻等)是创建新书所必需的。

我想知道,我什么时候应该创建新的表格和模型,例如为流派创建,以便我可以使用 book.genres 访问书籍的流派,什么时候可以只使用一个简单的用于定义属性的字符串变量?

我在想这取决于我是否想通过出版商/流派的名称访问不同的书,但是无论如何都可以使用 sql 查询来完成,不是吗?

我需要澄清一下这件事。何时创建单独的模型和表?

【问题讨论】:

    标签: ruby-on-rails ruby database sqlite


    【解决方案1】:

    您的问题与 Rails 特定,甚至与数据库无关。相反,您应该从面向对象设计的角度来处理它——答案是“取决于”。如果不考虑您要解决的问题,就没有一个正确的答案。

    在这种特定情况下,如果您需要定义在逻辑上不适合Book 模型的特定类型属性,我会考虑将Genre 设为自己的模型。例如,如果您正在为图书馆建模,您可能希望通过Genre 上的child_friendly 属性指定某些类型适合年轻读者。或者,如果您正在为书店建模,Genre 可能用于指定应在书店的哪个部分显示图书。

    【讨论】:

      【解决方案2】:

      我的一般经验法则是尽可能避免表中的重复,并考虑如果我将来需要更改此属性的可能性和容易程度。

      创建genres
      此解决方案消除了 books 表中的字符串重复。它还使更改流派的名称成为简单的一次更改修复,而不是多次更改修复。您只需在流派表中更改名称一次,而不是查找具有旧流派名称的所有记录并使用新名称更新它们。此外,为每个类型添加新属性(例如适当的年龄范围,或指示它是否是另一个类型的子类型)会更容易,因为表已经设置好了。

      ActiveRecord::枚举
      另一种解决方案是使用 ActiveRecord 的enum attribute。这与genres 表具有相同的内存节省和一些易于编辑的优点,但还有一些用于设置和检查书籍实例的类型值的辅助方法的额外好处,例如如果您有一个名为“惊悚片”的类型,使用枚举可以免费为您提供 setter 方法#thriller! 和布尔返回方法#thriller?

      【讨论】:

        【解决方案3】:

        如果您有不同型号的公共字段,在这种情况下,您应该使用Single Table Inheritance,只需在表中添加一个类型字段即可。此字段包含 model 名称。

        您可以参考以下链接了解单表继承 http://eewang.github.io/blog/2013/03/12/how-and-when-to-use-single-table-inheritance-in-rails/

        【讨论】:

          猜你喜欢
          • 2015-02-03
          • 2012-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多