0

假设我有模型

User < ActiveRecord::Base
end

和他的 STI 兄弟

MasqueradeUser < User
end 

masquerade_user =  MasqueradeUser.find 123
masquerade_user.class
# => MasqueradeUser

听起来很可笑,可以将此对象转换回父类User

masquerade_user.some_magic.class   # => User

我知道我可以覆盖mode_name,is_a?(User)和其他方法,以便 MasqueradeUser 将返回类似的值User

MasqueradeUser < User
  def model_name
    'User'
  end
end 

我只是想知道是否有办法将对象完全降级为父类实例

4

2 回答 2

6

您可以使用-becomes的功能,ActiveRecord请参见此处

于 2013-07-18T13:24:56.160 回答
0

您可以这样泛化ActiveRecord'sbecomes方法:

def becomes(klass)
  became = klass.new
  became.instance_variable_set("@attributes", @attributes)
  became
end

毕竟这只是将变量复制到另一个支持它们的对象中的问题(即:它可以“成为”任何类,而不仅仅是超类)

于 2013-07-18T13:43:09.720 回答