5

在我的數據庫我有一個表people,和我使用單表繼承,這些類:Rails的STI,多層次的繼承查詢

class Person < ActiveRecord::Base 
end 

class Member < Person 
end 

class Business < Member 
end 

Demonstration of the problem

它產生混淆查詢我。我想要的是Member.all返回所有業務以及任何其他會員類型。它的確如此,但前提是我最近訪問過商業課程。我認爲這是因爲我的類沒有被緩存在開發模式(出於顯而易見的原因),但它仍然像奇怪/錯誤的行爲。

這是一個軌道錯誤?還是按預期工作?無論哪種情況,任何人都可以爲開發目的考慮一個很好的解決方案?

+0

請指定每個類中的繼承類型。 –

+0

你是什麼意思,歡兒子? – Obversity

回答

1

這是故意的行爲,官方的Rails上Autoloading and Reloading Constants指南說明它非常好,可以參考Autoloading and STI

...

一種確保其正常工作的方法ctly無論 執行的順序是由手工在 底部限定的根類的文件中的樹的葉子加載:

# app/models/polygon.rb 
class Polygon < ApplicationRecord 
end 
require_dependency 'square' 

只有那些至少孫子需要加載樹葉這 的方式。直接子類不需要預加載。如果層次結構 更深,則中間類將自底部遞歸自動加載,因爲它們的常量將作爲超類出現在類定義 中。

所以在你的情況下,這意味着將require_dependency "business"放在Person類的最後。

然而,當心其可以可能通過使用require代替require_dependency避免循環依賴的(即使它可禁止從跟蹤Rails和重裝文件更改時,畢竟,require_dependency是Rails內部方法) 。

+0

這是一個有趣的解決方案。我會在下次出現時再嘗試! – Obversity

3

默認情況下,Rails不急於在開發中加載類。嘗試改變下面一行在你config/environments/development.rb

# Do not eager load code on boot. 
config.eager_load = false 

到:

# Do eager load code on boot! 
config.eager_load = true 
+0

不錯的想法!它似乎在我製作的複製問題的虛擬應用程序中工作過,但沒有解決我真實應用程序中的所有問題(可能是由其他問題引起的)。稍後當我有時間進行正確測試時,我會將其標記爲已接受。謝謝! – Obversity