Rails: неверная ошибка типа наследования с одной таблицей
Итак, я работаю над переносом этого php-сайта с существующей базой данных, которую я не могу изменить для Rails. Существует таблица: Quotes
с столбцом с именем type
. Всякий раз, когда я пытаюсь создать модель этого и задаю тип, он сообщает мне следующую ошибку:
ActiveRecord::SubclassNotFound (Invalid single-table inheritance type: HOME is not a subclass of Quotes)
Я не понимаю, почему он думает о его наследовании, потому что он не должен. Мой метод создания выглядит следующим образом:
quote = Quotes.create(
agent_id: agent.id,
client_id: client.id,
type: 'HOME',
status: 0,
date_created: DateTime.now
)
Если я прокомментирую тип, все будет хорошо. Но с типом это ошибки.
Ответы
Ответ 1
Я решил это, установив для моделей inheritance_column значение nil. Модели Active Record могут наследовать из таблицы через атрибут :type
, установив inheritance_column в nil, удалив этот атрибут, позволяющий иметь столбец базы данных с именем type
class Quote < ActiveRecord::Base
self.inheritance_column = nil
end
Ответ 2
Мне очень жаль, что у меня есть потенциальная ошибка в коде, особенно в таких процессах, как создание модели. Лучше просто сменить зарезервированное слово на что-то еще и освободить себя, чтобы использовать столбцы наследования позже, если возникнет необходимость. Ниже приведено более чистое решение → переименовать имя столбца базы данных с помощью переноса
Он читает:
- Выполнить $ > рельсы сгенерировать миграцию ChangeColumnName
где, ChangeColumnName - это имя нашей миграции. Это может быть любое имя.
-
Теперь отредактируйте сгенерированный файл миграции в файле db/migrate/_change_column_name.rb
class ChangeColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
-
$ > rake db: migrate
Вам нужно будет отредактировать контроллер и просмотреть файлы, например. если название модели - Product, вы, вероятно, отредактируете эти файлы.
- /app/views/products/_form.html.erb
- /app/views/products/show.html.erb
- /app/controllers/products_controller.erb
- /app/views/products/index.html.erb