问题
I want to use a column called type
without invoking Single Table Inheritance (STI) - I just want type
to be a normal column that holds a String
.
How can I do this without having Rails expecting me to have single table inheritance and throwing an exception of The single-table inheritance mechanism failed to locate the subclass...This error is raised because the column \'type\' is reserved for storing the class in case of inheritance.
?
Any ideas on how to do this?
回答1:
In Rails 3.1 set_inheritance_column
is deprecated, also you can just use nil
as a name, like this:
class Pancakes < ActiveRecord::Base
self.inheritance_column = nil
#...
end
回答2:
You can override the STI column name using set_inheritance_column:
class Pancakes < ActiveRecord::Base
set_inheritance_column 'something_you_will_not_use'
#...
end
So pick some column name that you won't use for anything and feed that to set_inheritance_column
.
回答3:
I know this question is rather old and this deviates a bit from the question you are asking, but what I always do whenever I feel the urge to name a column type or something_type is I search for a synonym of type and use that instead:
Here are a couple alternatives: kind, sort, variety, category, set, genre, species, order etc.
回答4:
Rails 4.x
I encountered the problem in a Rails 4
app, but in Rails 4 the set_inheritance_column
method does not exist at all so you can't use it.
The solution that worked for me was to disable the single table inheritance by overriding ActiveRecord
’s inheritance_column
method, like this:
class MyModel < ActiveRecord::Base
private
def self.inheritance_column
nil
end
end
Hope it helps!
回答5:
If you want to do this for all models, you can stick this in an initializer.
ActiveSupport.on_load(:active_record) do
class ::ActiveRecord::Base
# disable STI to allow columns named "type"
self.inheritance_column = :_type_disabled
end
end
来源:https://stackoverflow.com/questions/7134559/rails-use-type-column-without-sti