Почему подклассы Rails STI сохраняются после изменения их моделей?
У меня есть модель рельсов называется Question
установить как STI (т.е. миграция включала type
атрибуты).
Код моей модели для Question
находится в файле с именем base.rb
в папке models/question/
и выглядит так:
class Question < ActiveRecord::Base
acts_as_paranoid
belongs_to :organization
has_many :answers
end
У меня есть несколько подклассов (то есть типов STI) вопросов. Например, в той же папке у меня есть файл с именем text.rb
:
class Text < Question
end
Вот странная вещь: раньше это было:
class TextQuestion < Question
end
... но я изменил это сегодня, и это определенно, 100% сохранено как прежнее.
В консоли, когда я бегу:
Question.subclasses.map { |c| c.name }
Я ожидал получить массив, который включал Text
и больше не включены TextQuestion
, Тем не менее, я получаю оба!
Я сбросил базу данных локально и перезагрузил консоль.
Любая идея, почему я все еще вижу TextQuestion
как подкласс Question
?
1 ответ
Помните, что данные типа STI хранятся в столбце в вашей базе данных с именем type
, Если вы переименуете подкласс, вам придется создать миграцию, чтобы либо удалить все старые экземпляры подкласса, которые находятся в базе данных, либо переименовать их соответствующим образом.
Например:
execute("UPDATE questions SET type='Text' WHERE type='TextQuestion'")
Конечно, приспособьте это к любому диалекту SQL, который вы используете.
Я думаю, что эти фантомы, которые вы видите, созданы ActiveRecord, так как он собирается создать запись как type
столбец указывает, даже если это не так.