Rails 3: перенос данных - PullRequest
4 голосов
/ 20 мая 2011

Приложение My Rails 3 имеет модель User и модель Profile. Пользователь has_one Профиль.

В настоящее время профиль имеет атрибуты first_name и last_name. Хотя я не уверен, почему вы можете захотеть изменить их, я изначально предполагал, что они должны быть изменяемыми, и поэтому я поместил их в модель профиля, а не в модель пользователя.

Однако по мере развития приложения я обнаружил, что на самом деле мне нужно, чтобы имя и фамилия пользователя не менялись, и что мне действительно нужно, чтобы они были частью модели User, а не модели профиля.

Итак, мне было интересно, вы можете написать миграцию, которая бы:

  1. Добавьте столбцы first_name и last_name в модель User.
  2. Возьмите существующее значение first_name и last_name для данного пользователя из связанной записи профиля и скопируйте его в модель пользователя.
  3. Удалите столбцы first_name и last_name из модели профиля, поскольку они больше не нужны.

Итак, это можно сделать? Не могли бы вы показать пример? И, самое главное, есть ли какие-то ошибки, о которых я должен знать? Я хотел бы применить это изменение к производственному приложению, поэтому важно, чтобы я не терял данные при внесении этого изменения.

Спасибо!

Ответы [ 3 ]

13 голосов
/ 20 мая 2011

Конечно, очень легко. Поместите это в миграцию:

    add_column(:users, :last_name, :string)
    add_column(:users, :first_name, :string)

    User.reset_column_information

    User.all.each do |u|
      u.last_name = u.profile.try(:last_name)
      u.first_name = u.profile.try(:first_name)
      u.save
    end

    remove_column(:profiles, :first_name)
    remove_column(:profiles, :last_name)

Я использовал здесь try (), чтобы уменьшить вероятность отсутствия профиля. Он не проверяет ошибки в операции сохранения, поэтому примите это во внимание, если считаете, что это необходимо. Также, как всегда, сделайте резервную копию базы данных перед ее запуском. :)

2 голосов
/ 20 мая 2011

Я думаю, это драгоценный камень, который вам нужен:

https://github.com/btelles/legacy_migrations

1 голос
/ 29 января 2014

Недавно я создал гем, который решает проблему с записью данных миграции в миграциях - https://github.com/ka8725/migration_data.

...