4

我刚刚阅读了 Chad Fowler 关于20 Rails Development No-Nos的博客文章。关于单表继承,他评论道:

存储一个名为“type”的列,其中包含一个类名,这是一个很好的指标,表明正在发生一些可疑的事情。这很可疑,但并不总是很糟糕。不过,我认为,无论何时使用它,都应该不止一次地问自己这是否是正确的解决方案。当您有大量 STI 和多态关联时,数据库不会做它们最擅长的事情。

我正在编写一个博客应用程序,并且我正在考虑使用 STI 来对帖子进行评论,以及访问者可以发布的联系消息(如果他们想与我取得联系)。我的Message模型将继承自我的Comment模型。它们都有共同的属性,除了Message会有一个额外的subject字段。另一个共同点是两者都将提交给 Akismet 进行垃圾邮件检查。

与其像 Chad 建议的那样不止一次地问自己这是否是正确的解决方案,我还想从 Stack Overflow 专家那里得到一些意见!我的提议听起来是否适合 STI?

4

1 回答 1

2

我已经多次使用 STI。考虑一个可能有 Page、NewsItem、BlogItem 等的 CMS。

它们每个都可以继承自一个公共类,而该类又继承自 ActiveRecord。每个模型的表都是相同的(标题、正文、标签、published_at),但每个模型可能具有不同的关联、不同的状态或不同的工作流,因此每个模型在自己的类中都有自定义代码。然而,它们都共享一个公共表和父类。它还允许我使用父类进行跨类搜索,并让生成的记录数组自动类型转换。

还有其他方法可以解决这个问题,也许不是最好的例子,但在对象行为可能不同但持久状态相同的情况下,STI 肯定会派上用场。当然,你必须确保这在未来也是如此。

在您的情况下,评论和联系信息是不同的。听起来将它们放在同一张桌子上没有任何好处。也许将共享代码放在父类中,或者最好放在 /lib 中的模块中。

于 2009-06-02T13:26:07.650 回答