Подтвердить что ты не робот

Rails - использовать тип столбца без STI?

Я хочу использовать столбец с именем "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. Любые идеи о том, как это сделать?

4b9b3361

Ответ 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