Я хочу использовать столбец с именем "type" без вызова Single Table Inheritance. Я просто хочу, чтобы Type был нормальным столбцом, содержащим строку. Как я могу сделать это, не имея рельсов, ожидающих, что у меня будет одно наследование/возвращение таблицы? 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.
Любые идеи о том, как это сделать?
Rails - использовать тип столбца без STI?
Ответ 1
В Rails 3.1 set_inheritance_column
устарела, также вы можете просто использовать nil
как имя, например:
class Pancakes < ActiveRecord::Base
self.inheritance_column = nil
#...
end
Ответ 2
Вы можете переопределить имя столбца STI, используя set_inheritance_column
:
class Pancakes < ActiveRecord::Base
set_inheritance_column 'something_you_will_not_use'
#...
end
Итак, выберите имя столбца, которое вы не будете использовать для чего-либо, и подайте его на set_inheritance_column
.
Ответ 3
Я знаю, что этот вопрос довольно старый, и это немного отклоняется от вопроса, который вы задаете, но что я всегда делаю, когда мне кажется, что желание назвать тип столбца или something_type - это поиск синонима типа и использование этого вместо:
Вот несколько альтернатив: вид, сортировка, разнообразие, категория, набор, жанр, вид, порядок и т.д.
Ответ 4
Rails 4.x
Я столкнулся с проблемой в приложении Rails 4
, но в Rails 4 метод set_inheritance_column
вообще не существует, поэтому вы не можете его использовать.
Решение, которое работало для меня, состояло в том, чтобы отключить однонаправленное наследование таблицы, переопределив метод ActiveRecord
s inheritance_column
, например:
class MyModel < ActiveRecord::Base
private
def self.inheritance_column
nil
end
end
Надеюсь, что это поможет!
Ответ 5
Если вы хотите сделать это для всех моделей, вы можете вставить это в инициализатор.
ActiveSupport.on_load(:active_record) do
class ::ActiveRecord::Base
# disable STI to allow columns named "type"
self.inheritance_column = :_type_disabled
end
end