Ruby on rails 复制对象空间对象id中的类

Ruby on rails 复制对象空间对象id中的类,ruby-on-rails,ruby,gem,rails-engines,Ruby On Rails,Ruby,Gem,Rails Engines,我遇到了一个奇怪的问题,我正在使用的rails引擎中的某些模型在对象空间中被复制 (rdb:1) ObjectSpace.each_object(::Class).each { |klass| puts klass.to_s + ": " + klass.object_id.to_s if klass.to_s.eql?("DynamicFieldsets::Field") } DynamicFieldsets::Field: 66866100 DynamicFieldsets::Field:

我遇到了一个奇怪的问题,我正在使用的rails引擎中的某些模型在对象空间中被复制

(rdb:1) ObjectSpace.each_object(::Class).each { |klass| puts klass.to_s + ": " + klass.object_id.to_s if klass.to_s.eql?("DynamicFieldsets::Field") }
DynamicFieldsets::Field: 66866100
DynamicFieldsets::Field: 71836380
2479

当这种情况发生时,我不能使用is_a?或相等性检查以测试对象是否为Field类的实例。这个问题只发生在开发过程中,看起来可能是由于cache_类关闭造成的。我认为上一个请求中的对象仍在对象空间中,但我不确定如何删除它。

这很容易通过
remove\u const
复制:

class X
  def self.foo
    "hello"
  end
end
first_x = X.new

Object.send :remove_const, :X
class X
  def self.foo
    "world"
  end
end
second_x = X.new

p first_x.class, first_x.class.object_id, second_x.class, second_x.class.object_id
  # => X, <an_id>, X, <another_id>
p first_x.class.foo, second_x.class.foo
  # => "hello", "world"

这是正确的行为,因为
X
指的是新类,而不是旧类。

+1,这看起来不可能。如何将两个对象绑定到同一个常量?如果…输出,
将“#{klass.inspect}:#{klass.object_id}”放在什么位置?什么排序类是
动态字段集::字段
?它来自哪里?DynamicFieldsets::Field是来自rails引擎的ActiveRecord::Base对象。检查对象空间中的类时,除了对象id之外,它们完全相同。检查是否相等的任何方法都将返回true,但检查对象是否相等的方法除外,例如is_a+1真奇怪。。。马修斯·莫雷拉说了什么
first_x.is_a? X  # => false
second_x.is_a? X # => true