我有一个'Book'模型。 出版商的名称和类型(惊悚,恐怖,幻想等)是创建新书所必需的。
我想知道,我应该何时创建新的表格和模型,例如类型,以便我可以使用 book.genres 访问图书的流派,并且只需使用简单的用于定义属性的字符串变量?
我在想,这取决于我是否想通过发布商/流派的名称访问不同的书籍,但无论如何都可以使用sql查询来完成,不是吗?
我需要对此事做一些澄清。何时创建单独的模型和表?
答案 0 :(得分:1)
对于您的问题,没有特定于Rails或甚至是特定于数据库的信息。相反,你应该从面向对象的设计角度来接近它 - 答案是“它取决于”。没有考虑你想要解决的问题,没有一个正确的答案。
在这种特定情况下,我会考虑在需要定义不符合Genre
模型的逻辑上适合的特定于类型的属性时,使Book
成为自己的模型。例如,如果您正在为库建模,则可能需要通过child_friendly
上的Genre
属性指定某些类型适合年轻读者。或者,如果您正在为书店建模,则可以使用Genre
来指定该书应显示在商店的哪个部分。
答案 1 :(得分:0)
我的一般经验法则是尽可能避免表格中的重复,并考虑如果我将来需要对此属性进行更改的可能性和容易程度。
创建400+
表
此解决方案消除了genres
表中的字符串重复。它还使一个类型的名称更改为一个简单的单一更改修复,而不是多变更修复。您只需在流派表中更改一次名称,而不是查找具有旧流派名称的所有记录并使用新名称更新它们。此外,为每个类型添加新属性(例如适当的年龄范围,或指示它是否是另一个类型的子类型)将更容易,因为该表已经设置。
<强>的ActiveRecord ::枚举强>
另一种解决方案是使用ActiveRecord的enum attribute。这具有相同的内存节省和books
表的一些易于编辑的好处,但具有用于设置和检查书籍实例的类型值的若干辅助方法的附加益处,例如,如果你有一个名为'惊悚片'的流派,使用enum会免费提供setter方法genres
和布尔返回方法#thriller!
。
答案 2 :(得分:-1)
如果您的公共字段具有不同的模型,那么只需在表格中添加类型字段即可使用Single Table Inheritance
。该字段包含model
名称。
您可以参考以下链接获取单表继承 http://eewang.github.io/blog/2013/03/12/how-and-when-to-use-single-table-inheritance-in-rails/