So, I am working on migrating this php site with an existing database which I cannot change over to Rails. There is a table: Quotes
with a column named type
. Whenever I try and create a model of this and set the type, it tells me the following error:
ActiveRecord::SubclassNotFound (Invalid single-table inheritance type: HOME is not a subclass of Quotes)
I don't understand why it thinks its inheriting because it's not supposed to. My create method looks like this:
quote = Quotes.create(
agent_id: agent.id,
client_id: client.id,
type: 'HOME',
status: 0,
date_created: DateTime.now
)
If I comment out the type, everything works fine. But with the Type it errors.
I resolved this by setting the models inheritance_column to nil. Active Record Models can inherit from a table through the attribute :type
, setting the inheritance_column to nil removes that attribute allowing you to have a database column named type
class Quote < ActiveRecord::Base
self.inheritance_column = nil
end
I hate having potential gotchas deep in the code especially in the intial processes like generating a model. Better to just change the reserved word to something else and free yourself up to take advantage of inheritance column later if the need comes up. A cleaner solution is listed here -> rename a database column name using migration
It reads;
- Execute $> rails generate migration ChangeColumnName where, ChangeColumnName is the name of our migration. This can be any name.
Now, edit the generated migration file at 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
You will have to edit controller and view files e.g. if the model name is Product then you will likely edit these files
- /app/views/products/_form.html.erb
- /app/views/products/show.html.erb
- /app/controllers/products_controller.erb
- /app/views/products/index.html.erb
来源:https://stackoverflow.com/questions/18243367/rails-invalid-single-table-inheritance-type-error