В настоящее время у меня несколько таблиц, которые очень похожи. Вероятно, я должен был создать их с ИППП.Добавить однократное наследование (STI) на существующие модели
TypeOne < ActiveRecord::Base
TypeTwo < ActiveRecord::Base
TypeThree < ActiveRecord::Base
TypeOne(id: integer, parent_id: integer, created_at: datetime, updated_at: datetime)
TypeTwo(id: integer, parent_id: integer, created_at: datetime, updated_at: datetime)
TypeThree(id: integer, parent_id: integer, created_at: datetime, updated_at: datetime)
Теперь я пытаюсь добавить STI к ним. Я создал BaseModel и добавил тип к этой модели.
BaseModel(id: integer, parent_id: integer, created_at: datetime, updated_at: datetime, type: string)
Я также провел миграцию и добавил ко всем типам столбца типа.
class AddTypeToTables < ActiveRecord::Migration
def change
add_column :type_ones, :type, :string
add_column :type_twos, :type, :string
add_column :type_threes, :type, :string
end
end
Я хочу объединить все таблицы типов в ИППП. В моделях имеются существующие данные. Если бы я объединил их в одну таблицу, я думаю, что идентификатор для соответствующих таблиц будет конфликтовать. Например:
#<TypeOne id: 4, parent_id: 1, created_at: "2015-05-08 18:39:09", updated_at: "2015-09-07 19:42:03">
#<TypeTwo id: 4, parent_id: 1, created_at: "2015-04-08 17:48:59", updated_at: "2015-09-07 14:17:48">
Если я пытаюсь использовать становится, по-видимому, чтобы изменить класс, но я не могу найти запись в BaseModel
TypeOne.last.becomes!(BaseModel)
#<BaseModel id: 4, parent_id: 1, created_at: "2015-05-08 18:39:09", updated_at: "2015-09-07 19:42:03">
BaseModel.all
=> []
Я также попытался изменить столбец типа из унаследованная таблица на basemodel
to = TypeOne.first
to.type = "BaseModel"
to.save
BaseModel.all
=> []
Я попытался изменить классы для каждого, чтобы быть потомком baseModel
TypeOne < BaseModel
TypeTwo < BaseModel
TypeThree < BaseModel
Когда я это делаю, я теряю соединение с существующими данными, и каждая из моделей кажется пустой.
Как я могу объединить существующие таблицы?
Существуют ли какие-либо внешние ключи, ссылающиеся идентификаторы записей (например, type_one.id, type_two.id , и т.д.)? Если нет, я бы рекомендовал SELECTing из одной таблицы и INSERTing в таблицу BaseModel, которая изменит идентификатор, поэтому не будет конфликтов, если у вас правильно настроен PRIMARY KEY. Затем используйте свою структуру наследования, как у вас есть. – frankpinto
STI = Одиночное наследование. Чтобы использовать его как предназначенный для использования, вам нужны все ваши данные в одной таблице – frankpinto
, что имеет смысл, спасибо – casekey