在ActiveRecord中更改对象的类

5 ruby activerecord

假设FireNinja < Ninja我的数据库中有一个对象,使用单表继承存储.后来,我意识到他真的是一个WaterNinja < Ninja.将他改为不同的子类最干净的方法是什么?更好的是,我喜欢创建一个新WaterNinja对象,只需更换FireNinja数据库中的旧对象,保留ID.

编辑 我知道如何WaterNinja从我现有的对象创建新对象FireNinja,我也知道我可以删除旧对象并保存新对象.我想做的是改变现有项目的类.我是通过创建一个新对象并做一些ActiveRecord魔术来替换行,或者通过对对象本身做一些疯狂的事情,或者甚至通过删除它并重新插入相同的ID来做到这一点是问题的一部分.

dig*_*noe 8

你可以通过这样做使你的FireNinja充当WaterNinja

@ninja.becomes(WaterNinja)
Run Code Online (Sandbox Code Playgroud)

如果要永久更改类,则只需覆盖type属性.

@ninja.type = "WaterNinja"
@ninja.save!
Run Code Online (Sandbox Code Playgroud)


Max*_*yak 2

你需要做两件事:

  • 创造WaterNinja < Ninja
  • ninjas表中运行类似的东西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 现在将成为一次性对象。