我怎么解决?
class Person
end
class Person < ActiveRecord::Base
end
TypeError: superclass mismatch for class Person.
我想重新初始化一个班级。
答案 0 :(得分:6)
一旦你在ruby中创建了一个类,就不能通过重新打开它来改变它的超类。
这就是您收到TypeError: superclass mismatch for class Person.
错误的原因。
其他答案提供了替代方案,但重要的是要注意,它们都没有修改现有的Person
类,但实际上创建了一个新类,并将旧的Person常量重新分配给新类,在已有的限制下由@ user1158559在他的回答中说明。
答案 1 :(得分:2)
请确保每次都使用相同的班级签名。
class Person < ActiveRecord::Base
def x
end
end
class Person < ActiveRecord::Base
def y
end
end
答案 2 :(得分:2)
你可以(有点)这样做。
# initial definition
class Person
end
# new definition
class OverridePerson < ActiveRecord::Base
end
Person = OverridePerson
OverridePerson
与您想要做的事情相似:
Person
将引用新课程与您想要做的事情的区别:
您的使用案例可能是:
重新定义Person
,将其打包以欺骗库或应用程序。虽然ActiveRecord :: Base对于duck-type来说是一个很难的选择,但IMO对于测试来说是完全合法的。我建议在原始类
您想创建一个名为Person
的类,但它已经定义。在这种情况下,我建议在模块中使用命名空间。
答案 3 :(得分:0)
它可能不是您寻找的答案,但它可以通过undefine a class
或常量来重新定义它,但它将失去所有原始方法:
Object.send(:remove_const, :Person)