假设FireNinja < Ninja我的数据库中有一个对象,使用单表继承存储.后来,我意识到他真的是一个WaterNinja < Ninja.将他改为不同的子类最干净的方法是什么?更好的是,我喜欢创建一个新WaterNinja对象,只需更换FireNinja数据库中的旧对象,保留ID.
编辑
我知道如何WaterNinja从我现有的对象创建新对象FireNinja,我也知道我可以删除旧对象并保存新对象.我想做的是改变现有项目的类.我是通过创建一个新对象并做一些ActiveRecord魔术来替换行,或者通过对对象本身做一些疯狂的事情,或者甚至通过删除它并重新插入相同的ID来做到这一点是问题的一部分.
你可以通过这样做使你的FireNinja充当WaterNinja
@ninja.becomes(WaterNinja)
Run Code Online (Sandbox Code Playgroud)
如果要永久更改类,则只需覆盖type属性.
@ninja.type = "WaterNinja"
@ninja.save!
Run Code Online (Sandbox Code Playgroud)
你需要做两件事:
WaterNinja < Ninjaninjas表中运行类似的东西UPDATE ninjas SET (type = 'WaterNinja') WHERE (type = 'FireNinja')就是这样。
对于进行运行时转换,这可以做到,但我不推荐。
class Ninja
def become_another_ninja(new_ninja_type)
update_attribute(:type, new_ninja_type)
self.class.find(id)
end
end
@water_ninja = @fire_ninja.become_another_ninja('WaterNinja')
Run Code Online (Sandbox Code Playgroud)
问题在于 @fire_ninja 现在将成为一次性对象。