2015-09-07 2 views
1

В настоящее время у меня несколько таблиц, которые очень похожи. Вероятно, я должен был создать их с ИППП.Добавить однократное наследование (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 

Когда я это делаю, я теряю соединение с существующими данными, и каждая из моделей кажется пустой.

Как я могу объединить существующие таблицы?

+0

Существуют ли какие-либо внешние ключи, ссылающиеся идентификаторы записей (например, type_one.id, type_two.id , и т.д.)? Если нет, я бы рекомендовал SELECTing из одной таблицы и INSERTing в таблицу BaseModel, которая изменит идентификатор, поэтому не будет конфликтов, если у вас правильно настроен PRIMARY KEY. Затем используйте свою структуру наследования, как у вас есть. – frankpinto

+0

STI = Одиночное наследование. Чтобы использовать его как предназначенный для использования, вам нужны все ваши данные в одной таблице – frankpinto

+0

, что имеет смысл, спасибо – casekey

ответ

1

Как вы помечать его с PostgreSQL я буду включать, как сделать то, что я предложил в мой комментарий как ответ:

INSERT INTO base_model SELECT * FROM type_one ORDER BY id ASC; 
INSERT INTO base_model SELECT * FROM type_two ORDER BY id ASC; 
INSERT INTO base_model SELECT * FROM type_three ORDER BY id ASC; 

Чтобы безопасно сделать это на производственном наборе, поставить SQL в перенос в db/migrate (т. е. в файл типа db/migrate/20150907185938_integrate_tables.rb) и сначала проверить его на вашей локальной базе данных. Это должно получить вас довольно близко:

class IntegrateTables < ActiveRecord::Migration 
    def up 
    execute "INSERT INTO base_model SELECT * FROM type_one ORDER BY id ASC;" 
    execute "INSERT INTO base_model SELECT * FROM type_two ORDER BY id ASC;" 
    execute "INSERT INTO base_model SELECT * FROM type_three ORDER BY id ASC;" 
    end 

    def down 
    raise ActiveRecord::IrreversibleMigration, "It is unclear where original data stops and inserted data begins, can't migrate down" 
    end 
end 

Пожалуйста, отметьте этот ответ, как принято, если он работал для вас :)

Смежные вопросы