0

我有兩個類:TopicBuy::Topic。後者是前者的一個子類,通過一個外鍵(Buy::Topic.topic_id == Topic.id)。所以基本上這是使用類表繼承模式。在類表繼承中,如何讓父和子使用相同的ID?

Buy::Topic有它自己的id和指向父Topic對象的外鍵topic_id

不過我想確保的Buy::Topic的ID是一樣的topic_id從父是這樣的:

#<Topic id: 22598>#<Buy::Topic id: 22598, topic_id:22598

這是可能的Rails的?這對搜索引擎優化的目的更好,並且可以更輕鬆地處理康康的load_and_authorize_resource(有時可以使用兩個錯誤的ID來查找內容)。

UDPATE:

該模式已設置並在相當長的時間內完成,因此它不太可能,現在將其更改爲STI。

+0

感覺就像如果你想讓id匹配,STI會是更好的選擇。你總是可以將Buy :: Topic定義爲Topic的一個特例... – 2012-03-06 04:27:48

+0

是的,我想過了,原因是子類有太多的其他領域。 – lulalala 2012-03-06 04:30:27

+0

...那很糟糕,因爲?引用Knuth的話,「過早優化是萬惡之源」。存儲空間是可笑的便宜。如果您的核心要求是「讓id與搜索引擎優化相同」,那麼優化,而不是存儲。 – 2012-03-06 04:59:42

回答

1

這樣做會主動破壞您的CTI,甚至可能會產生反模式!

我的觀點是,如果

Buy::Topic.id == Buy::Topic.topic_id == Topic.id 

然後創建購買::主題與主題之間的一個一對一的關係。

這意味着沒有其他類可以由Buy::Topic組成,因爲id可能會與某些Topic.id發生衝突。

由於Buy::TopicTopic的子類,因此您現在只有一個概念實體。除了你有兩張桌子和一些瘋狂的索引讓你在那裏。

+0

是的,這是一對一的關係。我沒有得到爭論的衝突部分。 – lulalala 2012-03-06 04:41:46

+0

CTI通常用於基本模擬關係數據庫的組合。即:你有一個個人和一個組織,兩者都有共同的地址相關的字段。然後,您可以創建一個可以由他們鏈接的聯繫表。此功能丟失,使得'Buy :: Topic'只能通過'Topic'使用。在這裏看到更多:http://laughingmeme.org/2004/08/14/mysql-and-the-case-for-class-table-inheritance/ – 2012-03-06 04:50:01

+0

那麼,購買::主題是主題的一些擴展,所以它使購買::主題不屬於主題沒有意義。而且由於在我開始維護它之前已經完成並設置了,所以我不會改變它。 – lulalala 2012-03-08 02:10:47

0

好傢伙,這是正常的,只是打電話給你列topic_parent_id像這樣建立關聯關係:

belongs_to的:父:CLASS_NAME => '主題',:foreign_key => 'topic_parent_id'