Скажем, у меня есть a FireNinja < Ninja
объект в моей базе данных, сохраненном использующем единственном наследовании таблицы. Позже, я понимаю, что он действительно a WaterNinja < Ninja
. Что самый чистый путь состоит в том, чтобы изменить его на другой подкласс? Еще лучше я хотел бы создать новое WaterNinja
возразите и просто замените старое FireNinja
в DB, сохраняя идентификатор.
Редактирование, которое я знаю, как создать новое WaterNinja
объект от моего существующего FireNinja
, и я также знаю, что могу удалить старый и сохранить новый. То, что я хотел бы сделать, видоизменяют класс существующего объекта. Делаю ли я это путем создания нового объекта и выполнения некоторого волшебства ActiveRecord заменить строку, или путем выполнения своего рода сумасшедшей вещи к самому объекту, или даже путем удаления его и перевставки с тем же идентификатором является частью вопроса все же.
Вам нужно сделать две вещи:
WaterNinja
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')
Проблема в том, что @fire_ninja теперь будет одноразовым объектом.
Предпочитайте композицию наследованию - вы должны использовать шаблон стратегии, чтобы изменить этот тип поведения во время выполнения.
Вам нужно будет определить метод WaterNinja # to_fireninja
. Ruby не имеет возможности изменить класс объекта, сохранив при этом тот же объект.
class WaterNinja < Ninja
def to_fireninja
FireNinja.new :name => name
end
end