2009-06-01 65 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