我该如何解决?
class Person
end
class Person < ActiveRecord::Base
end
TypeError: superclass mismatch for class Person.
我想重新初始化一个类。
我该如何解决?
class Person
end
class Person < ActiveRecord::Base
end
TypeError: superclass mismatch for class Person.
我想重新初始化一个类。
一旦你在 ruby 中创建了一个类,你就不能通过重新打开它来改变它的超类。这就是您收到TypeError: superclass mismatch for class Person.
错误的原因。
其他答案提供了替代方案,但重要的是要注意,它们都没有修改现有Person
类,而是实际上创建了一个新类并将旧的 Person 常量重新分配给新类,在@user1158559 在他的答案中已经说明的限制下。
只要确保每次都使用相同的类签名。
class Person < ActiveRecord::Base
def x
end
end
class Person < ActiveRecord::Base
def y
end
end
你可以(有点)这样做。
# initial definition
class Person
end
# new definition
class OverridePerson < ActiveRecord::Base
end
Person = OverridePerson
OverridePerson
与您想要做的相似之处:
Person
将引用新类与您想要做的不同之处:
您的用例可能是:
重新定义Person
,鸭式键入它以欺骗库或应用程序。IMO 这对于测试目的来说是完全合法的,尽管 ActiveRecord::Base 将是一个很难鸭式的。我建议在原始类上使用 FakeAR 或 RSpec 模拟或存根
您想创建一个名为 的类Person
,但它已被定义。在这种情况下,我建议在模块中使用命名空间。
它可能不是您要寻找的答案,但它是一种方法undefine a class
或常量,因此您可以重新定义它,但它会丢失所有原始方法:
Object.send(:remove_const, :Person)