Миграция: изменить целое число на ссылку без потери строк - PullRequest
0 голосов
/ 17 ноября 2018

Я работаю над существующим проектом, и мне нужно изменить тип существующего поля. Это поле было объявлено как

add_column :users, :fo_creator, :integer

Но поскольку поле fo_creator является ссылкой на таблицу пользователей, мне нужно изменить ее на:

add_reference :user, :fo_creator, index: true

Как я могу сделать это без потери сохраненных данных

1 Ответ

0 голосов
/ 17 ноября 2018

Нет ничего волшебного в столбцах, созданных макросом references.

references :fo_creator создает:

  • bigint fo_creator_id столбец
  • внешний ключ

Причина, по которой ваша ассоциация не работает, скорее всего, belongs_to :fo_creator предполагает, что столбец fkey имеет имя :fo_creator_id.Хотя это можно изменить, указав параметр foreign_key, я бы сказал, что вы вправе переименовать столбец, чтобы устранить это несоответствие.

Вы можете восстановить существующий столбец, переименовав столбец и добавив внешний ключ:

class ChangeUsersFoCreatorToReference < ActiveRecord::Migration[5.2]
  def change
    rename_column :users, :fo_creator, :fo_creator_id
    change_column :users, :fo_creator_id, :bigint # optional
    add_foreign_key :users, :fo_creators
  end
end

Если fo_creator_id является самоссылкой (ссылается на таблицу пользователей), вам нужно создать fk следующим образом:

# from table, to table
add_foreign_key :users, :users, column: :fo_creator_id

См .:

...