Rails - использовать тип столбца без STI? - PullRequest
77 голосов
/ 21 августа 2011

Я хочу использовать столбец с именем type без вызова Single Table Inheritance (STI) - я просто хочу, чтобы type был обычным столбцом, который содержит String.

Как мне это сделать?это без Rails, ожидающего, что у меня будет одиночное наследование таблиц, и выдающего исключение 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.?

Любые идеи о том, как это сделать?

Ответы [ 5 ]

126 голосов
/ 08 августа 2012

В Rails 3.1 set_inheritance_column устарело, также вы можете просто использовать nil в качестве имени, например:

class Pancakes < ActiveRecord::Base
    self.inheritance_column = nil
    #...
end
20 голосов
/ 21 августа 2011

Вы можете переопределить имя столбца STI, используя set_inheritance_column:

class Pancakes < ActiveRecord::Base
    set_inheritance_column 'something_you_will_not_use'
    #...
end

Так что выберите название столбца, которое вы ни для чего не будете использовать, и введите его set_inheritance_column.

19 голосов
/ 05 февраля 2016

Я знаю, что этот вопрос довольно старый, и он немного отличается от вопроса, который вы задаете, но то, что я всегда делаю всякий раз, когда чувствую желание назвать тип столбца или что-то типа, - это поиск синонима типа и использование этого вместо:

Вот несколько альтернатив: вид, сорт, сорт, категория, набор, жанр, вид, порядок и т. Д.

8 голосов
/ 16 апреля 2015

Rails 4.x

Я столкнулся с проблемой в приложении Rails 4, но в Rails 4 set_inheritance_columnМетод не существует вообще, поэтому вы не можете его использовать.

Решение, которое сработало для меня, состояло в том, чтобы отключить наследование одной таблицы путем переопределения метода ActiveRecord inheritance_column, например:

class MyModel < ActiveRecord::Base

  private

  def self.inheritance_column
    nil
  end

end

Надеюсь, это поможет!

0 голосов
/ 12 октября 2016

Если вы хотите сделать это для всех моделей, вы можете вставить это в инициализатор.

...