2009-06-01 97 views
4

我刚读过Chad Fowler的博客文章20 Rails Development No-Nos。在单表继承他评论:这是Rails的单表继承的合法使用吗?

存储名为“类型”的列,其中包含类名是一个很好的指标,有点可疑。它很腥,但并不总是很糟糕。不过,我认为,只要你使用它,你应该不止一次地问自己,如果这是正确的解决方案。当你有很多STI和多态关联时,数据库不会做他们最擅长的事情。

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

而不是像乍得所说的那样,不止问自己一次,我想我会从Stack Overflow专家那里得到一些意见!我的建议听起来是否适合STI?

+0

另请参阅http://stackoverflow.com/questions/6073617/single-table-inheritance-or-class-table-inheritance – 2013-03-19 10:07:54

回答

2

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

它们都可以从一个普通的类继承而来,而这个类又继承自ActiveRecord。每个表格都是相同的(标题,正文,标签,published_at),但每个模型可能有不同的关联,不同的状态或不同的工作流程,因此每个模型都有自己的类中的自定义代码。然而,他们都有一个共同的桌子和父母班。它还允许我使用父类进行跨类搜索,并让结果数组的记录自动键入cast。

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

在你的情况下,评论和联系消息是不同的。听起来好像在同一张桌子里没有任何好处。也许把共享代码放在父类中,或者更好地放在/ lib中的模块中。

+0

这将是很好,有一些具体的例子,STI是'坏'。 – Kris 2009-06-03 10:04:29