2016-08-23 3 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

코드에서이 작업을 수행하고 있습니다. 콘솔을 다시로드하십시오! 그리고 나는 티가 위에 보여진 명확한 행동을한다고 생각합니다. 코드에서 동일한 효과를 얻을 수 없습니다. – 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 그게 힘든 일이다. 어디에서 할 수 있을지 생각하고있다. 실제로는 좋은 시작이다. 게다가 이름없는 클래스로 바꾸거나 MRI에서'object_id'를 기록하여 해킹 스타일의 참조를 얻을 수 있다고 조언한다. , 위의 클래스'ObjectSpace._id2ref (0x007fd64772dc68 >> 1)'에 대한 참조를 주면 ObjectSpace를 반복하여 여러 종류의 참조를 검색 할 수 있습니다 – Vasfed

+0

방금 ​​조사한 결과 객체 자체를 삭제할 수 없다는 것을 깨달았습니다. 'object = nil'과'GC.start'를 시도했지만 아직 남아 있습니다. 그게 정상인가요? – nikmak

관련 문제