2015-10-13 2 views
1

У меня есть приложение Rails с настраиваемым алгоритмом для генерации id для одной таблицы. Теперь я решил использовать инкрементные идентификаторы по умолчанию, созданные Postgres в качестве основных ключей, и переместить мои пользовательские значения с id в другой столбец, например uid. И я хочу восстановить значения в столбце id для всех записей - как обычно от 1 до n.
Каков наилучший способ сделать это? У меня около 1000 записей. Записи из других таблиц связаны с этими записями.Регенерировать идентификаторы существующих записей

ответ

0

Вы можете просто сделать это, выполнив итерацию по вашим записям и обновив их (и связанные с ними объекты). 1000 записей не так много для обработки.

Предположим, что у вас есть таблица с именем «my_objects» с ее моделью под названием «MyObject». Давайте также скажем, что у вас есть другая таблица с именем «related_objects» и ее модель «RelatedObject»

Вы можете перебирать все записи MyObjects и одновременно обновлять связанные объекты и запись.

records = MyObject.all #Whatever "MyObject" you have. 
i = 0 
records.each do |record| 
    #Updating whatever associated objects the record have 
    record.related_objects.each do |related_object| 
    related_object.update_column("my_object_id", i) 
    end 
    #Updating the record itself 
    record.update_column("id", i) 
    i++ 
end 
+0

Как бы я обрабатывал отношения habtm? Когда я изменяю первичный ключ, они не обновляются автоматически. Я также думаю, что я должен обернуть обновления в транзакциях? – leemour

+0

Вы можете создать временную модель ActiveRecord для средней таблицы вашей ассоциации habtm (как в ассоциации «has_many through») и использовать ее для обновления ключей в этой таблице, как и любой связанный объект. http://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many – Caillou

+0

Как бы удалить ассоциации для старого id и воссоздать их для нового идентификатора ? 'objects = record.associatied_objects.map (&:id); record.associatied_objects = []; record.save !; Object.where (id: objects) .each {| o | record << o}' <- этот путь? – leemour

0

Вы можете сохранить любое значение в ID колонка, но создать новый столбец с именем UID и установить его в качестве первичного ключа и автоматического приращения

def self.up 
    execute "ALTER TABLE mytable modify COLUMN uid int(8) AUTO_INCREMENT" 
    end 

Вы можете сказать, модели использовать UID в качестве основных как

self.primary_key = 'uid' 
Смежные вопросы