2014-12-03 66 views
0

我今天在Rails應用程序工作(紅寶石2.1.3/Rails的4.1),其中有幾類從一個類繼承項:古怪的單表繼承臭蟲在Ruby on Rails的

主類是項目,有一個Page類繼承自繼承自Page類的Item和DownloadPage類。所有對象都存儲在一個單一的表,按類型列包含對象的類名(頁,文章,DownloadPage等)

這裏是UML進行區分:

UML

這裏什麼數據看起來像DB(項目表):

DB

回到問題,當應用程序加載,和我去頁#指數,從項目表類型「頁」的所有對象都列出來,everyt hing很好,但是當應用程序至少使用類DownloadPage(例如:DownloadPage.first)時,頁面#索引發送類型爲DownloadPage的頁面類型PLUS對象的每個對象,這是不正常的。

這是問題的一個演示,請注意SQL查詢只選擇頁面類型在第一時間(步驟1)和頁面+ DownloadPage第二次(第3步):

enter image description here

所以我問題是,我做錯了什麼,架構可能不好還是別的?或者是,一個導軌/紅寶石錯誤

OUTPUT:

2.1.3 :001 > Page.first 

Page Load (0.9ms) SELECT "items".* FROM "items" WHERE "items"."type" IN ('Page') 

=> #<Page id: 2, type: "Page",... 

2.1.3 :002 > DownloadPage.first 

DownloadPage Load (0.6ms) SELECT "items".* FROM "items" WHERE "items"."type" IN ('DownloadPage') AND "items"."deleted_at" IS NULL ORDER BY "items"."id" ASC LIMIT 1 

=> #<DownloadPage id: 26, type: "DownloadPage",... 

2.1.3 :003 > Page.first 

Page Load (1.8ms) SELECT "items".* FROM "items" WHERE "items"."type" IN ('Page', 'DownloadPage') 

=> #<Page id: 2, type: "Page", title: "sdfPage"... 
+0

您的圖像不清晰。你能不能在這裏發佈你的圖片中的查詢? – 2014-12-03 20:58:31

+0

我更新了OP,回覆格式在SO – avatsaev 2014-12-03 21:04:20

+0

上很奇怪.Giant截圖並不是特別有用。是不是有一個更簡潔的方式來表達這一點? – tadman 2014-12-03 21:07:29

回答

3
class Page < Item 
end 

require_dependency 'download_page' 

https://github.com/rails/rails/issues/8699

+0

感謝這解決了奇怪的行爲,但是當我做Page.all時,我怎樣才能防止DownloadPages的加載,例如,我只想要Pages不是兩個。 – avatsaev 2014-12-03 21:47:39

+1

這是因爲DownloadPages也是頁面的預期行爲。如果你只想要不是DownloadPages的頁面,你需要添加一個where子句來限制它 – bridiver 2014-12-04 02:15:05

+0

謝謝!我在範圍內添加了一堆類型爲「頁面」的子句,並且工作正常。 – avatsaev 2014-12-04 08:45:13