2016-08-23 8 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(....)] 

しかし、それは効果がありません。

誰でもこの方法を教えてもらえますか? ありがとう ニック

+0

コードでこれを実行していますか?またはコンソールを使用していますか? – jaydel

+0

私はコードでこれをやっています。コンソールのリロードで!私はティが上記の明確な行動をすると思う。コードで同じ効果を得ることはできません。 – 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

関連する問題