Как вы сказали, Ruby не разрешает приведение типов. Скорее, здесь происходит то, что ActiveRecord создает экземпляр другого класса в зависимости от значения поля type
. Поэтому, когда вы меняете его на «бета», вы на самом деле ничего не делаете с точки зрения Руби.
Но когда ActiveRecord просматривает базу данных для извлечения записи, он видит новое значение type
и создает экземпляр Beta
, а не Alpha
. Этот процесс имеет меньшее отношение к Ruby, чем к ActiveRecord, в частности.
Иногда есть более элегантные подходы в зависимости от вашей ситуации. Если вам нужно «преобразовать» модель из одного типа в другой (например, Employee
становится Manager
, у которого есть дополнительные методы), это разумный способ. В других случаях ваша цель может быть лучше достигнута с помощью миксинов или другого инструмента.
Вы также можете создать временный экземпляр Beta
из атрибутов Alpha
, если вам нужно, например:
# obj is an instance of Alpha
obj = Beta.new(obj.attributes)
Но это также странная вещь, которую нужно делать в большинстве случаев.