2016-08-23 115 views
1

我正在嘗試動態創建和刪除導軌模型。創作有效但不能刪除。動態刪除導軌模型

我試着刪除它作爲一個常量,但它仍然存在作爲一個軌道子類:

Object.send(:remove_const, :ModelToBeDeleted) 

# Check it's gone from Object 
Object.constants.include? :ModelToBeDeleted # => false 

# But it is still in rails: 
ActiveRecord::Base.subclasses 
# returns 
[ModelToBeDeleted(....)] 

,我已經使用回調在整理,在發展中重裝時做此嘗試:

ActiveSupport::DescendantsTracker.clear 
ActiveSupport::Dependencies.clear 

但它沒有效果。

任何人都可以幫助我如何做到這一點? 感謝 尼克

+0

你在做代碼?或者你在使用控制檯嗎? – jaydel

+0

我在代碼中這樣做。在控制檯重新加載!將工作,我認爲TI做出了上述明確的行動。我無法在代碼中獲得相同的效果。 – nikmak

回答

0

類是垃圾回收方式相同規則物體 - 當沒有對它們的引用。

最常見的引用是常量和實例,也可能有常規引用。確保所有對該類的引用都沒有了

class CLS; end 
c = Class.new(CLS) 
CLS.subclasses # => [#<Class:0x007fd64772dc68>] 
obj = c.new 
c = nil 
GC.start 
CLS.subclasses # => [#<Class:0x007fd64772dc68>] 
obj = nil 
GC.start 
CLS.subclasses # => [] 
+0

如何找到對類的引用? – nikmak

+0

@nikmak這是一項艱鉅的任務,思考它可以在哪裏 - 實際上是一個好的開始,另外我建議切換到未命名的類,或寫入它的'object_id'來記錄,在MRI中你可以得到黑客風格的參考,對於上面的類'ObjectSpace._id2ref(0x007fd64772dc68 >> 1)''會給你一個參考,那麼你可以迭代ObjectSpace來搜索不同種類的引用 – Vasfed

+0

我剛纔調查並意識到我無法刪除對象本身。我嘗試過'object = nil'和'GC.start',但它仍然存在。這是正常的嗎? – nikmak