rename_column удаляет все содержимое столбцов - PullRequest
0 голосов
/ 16 декабря 2011

Привет, у меня проблема миграции рельсов:

Когда я запускаю миграцию следующим образом:

class RenameColumn < ActiveRecord::Migration
  def change
    rename_column :users, :hotel_stars, :rating_stars
    rename_column :users, :restaurant_stars, :price_stars
  end
end

и выполняю rake db: migrate, она работает нормально.Столбцы переименованы, и данные этих столбцов находятся там.Но когда я затем делаю грабли db: drop, create, migrate, столбцы переименовываются, и данные этих столбцов исчезают ... (Один из моих файлов миграции заполняет базу данных, а также заполняет эти два столбца, прежде чем они будут переименованы)

В чем здесь проблема?

Еще один вопрос: я знаю, что не стоит менять старые миграционные файлы, но это нормально, когда я запускаю rake db: drop db: create и db: мигрировать позже - или это вызовет проблемы?

Порядок моих файлов миграции следующий:

add_devise_to_users -> создает таблицу users

add_columns_to_default_user -> добавляет столбцыи обновляет всю таблицу

class AddColumnsToDefaultUser < ActiveRecord::Migration
  def change
    add_column :users, :name, :string
    add_column :users, :dob, :date
    add_column :users, :address, :string
    add_column :users, :hotel_stars, :integer
    add_column :users, :restaurant_stars, :integer
    add_column :users, :profile_picture_url, :string
    add_column :users, :selected_car, :integer

    User.reset_column_information

    User.find(1).update_attributes!( :name => 'Alexander MacDonald', :dob => '1984-08-20', :address => '900 Highschool Way, Mountain View, CA 94041', :hotel_stars => '3', :restaurant_stars => '2', :profile_picture_url => 'user1.png', :selected_car => 1)

  end
end

, а затем переименовывает_column

class RenameColumn < ActiveRecord::Migration
  def change
    rename_column :users, :hotel_stars, :rating_stars
    rename_column :users, :restaurant_stars, :price_stars
  end
end

1 Ответ

1 голос
/ 16 декабря 2011

Когда вы делаете db:drop, вы стираете свою БД.

Итак, когда вы это делаете, данные стираются.Эти данные не собираются во временное место для повторной вставки.Если вы хотите сохранить данные, которые находятся в БД до / после db:drop, вам нужно сохранить их где-нибудь и заново вставить самостоятельно.

Когда вы изменяете только структуру, если у вас нет определенногопричина, чтобы удалить данные, которые уже там, все, что вам нужно сделать, это db:migrate.

В качестве альтернативы вы можете использовать что-то вроде populator , чтобы очистить / заполнить вашу БД тестомданные после миграции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...