2016-08-23 3 views
1

Ich versuche, Schienenmodelle dynamisch zu erstellen und zu löschen. Die Erstellung funktioniert, aber nicht das Löschen.Dynamisches Löschen eines Schienenmodells

Ich habe versucht, es als eine Konstante zu löschen, aber es ist immer noch vorhanden als Schienen Unterklasse:

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(....)] 

ich dann hat versucht, den Rückruf in den Finisher verwenden, die dies tut, wenn in der Entwicklung Nachladen:

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

Aber es hat keine Wirkung.

Kann mir jemand helfen, wie das geht? Dank Nick

+0

Machst du das in Code? oder benutzt du die Konsole? – jaydel

+0

Ich mache das in Code. In der Konsole neu laden! würde funktionieren und ich denke, dass Ti die oben gezeigten klaren Aktionen tut. Im Code kann ich nicht den gleichen Effekt erzielen. – nikmak

Antwort

0

Klassen sind Müll auf die gleiche Weise wie normale Objekte gesammelt - wenn es keine Verweise auf sie ist.

Häufigste Referenzen sind Konstanten und Instanzen, auch hier kann es regelmäßige Referenzen geben. Stellen Sie sicher, dass alle Verweise auf die Klasse nicht mehr vorhanden sind

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

Wie kann ich die Verweise auf die Klassen finden? – nikmak

+0

@nikmak das ist eine schwierige Aufgabe, darüber nachzudenken, wo es sein kann - ist eigentlich ein guter Anfang, plus ich rate zu unbenannten Klassen wechseln, oder schreibe seine 'object_id' zu loggen, in MRI können Sie Hack-Stil-Referenz erhalten , für obige Klasse 'ObjectSpace._id2ref (0x007fd64772dc68 >> 1)' gibt Ihnen eine Referenz, dann können Sie ObjectSpace bei der Suche nach verschiedenen Arten von Referenzen iterieren – Vasfed

+0

Ich habe gerade untersucht und realisiert, dass ich das Objekt selbst nicht löschen kann. Ich habe 'object = nil' und' GC.start' versucht, aber es ist immer noch da. Ist das normal? – nikmak