Ruby on rails 动态删除rails模型

Ruby on rails 动态删除rails模型,ruby-on-rails,Ruby On Rails,我正在尝试动态创建和删除rails模型。创建有效,但不能删除 我尝试将其作为常量删除,但它仍然作为rails子类存在: Object.send(:remove_const, :ModelToBeDeleted) # Check it's gone from Object Object.constants.include? :ModelToBeDeleted # => false # But it is still in rails: ActiveRecord::Base.subclas

我正在尝试动态创建和删除rails模型。创建有效,但不能删除

我尝试将其作为常量删除,但它仍然作为rails子类存在:

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(....)]
然后,我尝试在finisher中使用回调,在开发中重新加载时会执行此操作:

ActiveSupport::DescendantsTracker.clear
ActiveSupport::Dependencies.clear
但它没有效果

有人能帮我做这件事吗? 谢谢
尼克

类的垃圾收集方式与常规对象的垃圾收集方式相同——没有对它们的引用

最常见的引用是常量和实例,也可能有常规引用。确保该类的所有引用都已删除

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 # => []
CLS类;结束
c=新类别(CLS)
CLS.subclass#=>[#]
obj=c.new
c=零
GC.start
CLS.subclass#=>[#]
obj=零
GC.start
CLS.subclass#=>[]

类以与常规对象相同的方式进行垃圾收集—当没有对它们的引用时

最常见的引用是常量和实例,也可能有常规引用。确保该类的所有引用都已删除

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 # => []
CLS类;结束
c=新类别(CLS)
CLS.subclass#=>[#]
obj=c.new
c=零
GC.start
CLS.subclass#=>[#]
obj=零
GC.start
CLS.subclass#=>[]

您是在代码中执行此操作的吗?或者你在用控制台?我是用代码做的。在控制台中重新加载!我认为ti会采取上述明确的行动。我不能在代码中得到同样的效果。你是在代码中这样做的吗?或者你在用控制台?我是用代码做的。在控制台中重新加载!我认为ti会采取上述明确的行动。我无法在代码中获得同样的效果。我如何才能找到对类的引用?@nikmak这是一项艰巨的任务,思考它可以在哪里——实际上是一个良好的开端,另外我建议切换到未命名的类,或者将其
对象id
写入日志,在MRI中,您可以获得针对上述类
对象空间的黑客风格的引用。\u id2ref(0x007fd64772dc68>>1)
将为您提供一个引用,然后您可以迭代ObjectSpace以搜索不同类型的引用我刚刚调查并意识到我无法删除对象本身。我尝试了
object=nil
GC.start
,但它仍然存在。这正常吗?@nikmak这意味着某个地方还剩下一个引用,例如model可以有关系和对象在关联中徘徊。你真的必须检查所有可以引用它的东西。我如何才能找到对类的引用?@nikmak这是一项艰巨的任务,思考它可以在哪里-实际上是一个很好的开始,另外我建议切换到未命名的类,或者将其
对象id
写入日志,在MRI y中您可以获取上述类
ObjectSpace的hack样式参考。\u id2ref(0x007fd64772dc68>>1)
将为您提供一个引用,然后您可以迭代ObjectSpace以搜索不同类型的引用我刚刚调查并意识到我无法删除对象本身。我尝试了
object=nil
GC.start
,但它仍然存在。这正常吗?@nikmak这意味着某个地方还剩下一个引用,例如model可以有关系和对象在关联中挥之不去。你真的必须检查所有可以引用它的东西