Изменение класса объекта в ActiveRecord

Скажем, у меня есть a FireNinja < Ninja объект в моей базе данных, сохраненном использующем единственном наследовании таблицы. Позже, я понимаю, что он действительно a WaterNinja < Ninja. Что самый чистый путь состоит в том, чтобы изменить его на другой подкласс? Еще лучше я хотел бы создать новое WaterNinja возразите и просто замените старое FireNinja в DB, сохраняя идентификатор.

Редактирование, которое я знаю, как создать новое WaterNinja объект от моего существующего FireNinja, и я также знаю, что могу удалить старый и сохранить новый. То, что я хотел бы сделать, видоизменяют класс существующего объекта. Делаю ли я это путем создания нового объекта и выполнения некоторого волшебства ActiveRecord заменить строку, или путем выполнения своего рода сумасшедшей вещи к самому объекту, или даже путем удаления его и перевставки с тем же идентификатором является частью вопроса все же.

5
задан 9 July 2010 в 18:09
поделиться

3 ответа

Вам нужно сделать две вещи:

  • Создать 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 теперь будет одноразовым объектом.

2
ответ дан 14 December 2019 в 01:01
поделиться

Предпочитайте композицию наследованию - вы должны использовать шаблон стратегии, чтобы изменить этот тип поведения во время выполнения.

http://en.wikipedia.org/wiki/Strategy_pattern

0
ответ дан 14 December 2019 в 01:01
поделиться

Вам нужно будет определить метод WaterNinja # to_fireninja . Ruby не имеет возможности изменить класс объекта, сохранив при этом тот же объект.

class WaterNinja < Ninja
  def to_fireninja
    FireNinja.new :name => name
  end
end
-1
ответ дан 14 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: