Почему подклассы 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 столбец указывает, даже если это не так.

Другие вопросы по тегам