ruby-on-rails - references - rails rollback migration




Как я могу переименовать столбец базы данных в миграции Ruby on Rails? (17)

Я ошибочно назвал столбец hased_password вместо hashed_password .

Как обновить схему базы данных, используя миграцию, чтобы переименовать этот столбец?


Run rails g migration ChangesNameInUsers (или что бы вы хотели назвать)

Откройте только что сгенерированный файл миграции и добавьте эту строку в метод (в промежутке между def change и end ):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

Сохраните файл и запустите rake db:migrate выполните rake db:migrate в консоли

Проверьте свой schema.db , чтобы узнать, действительно ли имя изменилось в базе данных!

Надеюсь это поможет :)


В качестве альтернативного варианта, если вы не состоите в браке с идеей миграции, есть неотразимый камень для ActiveRecord, который автоматически обрабатывает изменения имен для вас, стиль Datamapper. Все, что вы делаете, это изменить имя столбца в вашей модели (и убедитесь, что вы положили Model.auto_upgrade! В нижней части вашей модели.rb) и альта! База данных обновляется «на лету».

https://github.com/DAddYE/mini_record

Примечание. Для предотвращения конфликтов вам понадобится nuke db / schema.rb

Тем не менее в бета-фазах и, очевидно, не для всех, но все же привлекательный выбор (я в настоящее время использую его в двух нетривиальных продуктовых приложениях без проблем)


Выполните команду ниже, чтобы создать файл миграции:

rails g migration ChangeHasedPasswordToHashedPassword

Затем в файл, сгенерированный в папке db/migrate , напишите rename_column как rename_column ниже:

class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
  def change
     rename_column :table_name, :hased_password, :hashed_password
  end
end

Для Ruby on Rails 4:

def change
    rename_column :table_name, :column_name_old, :column_name_new
end

Если ваш код не используется совместно с другим, лучшим вариантом будет сделать только rake db:rollback затем отредактировать имя столбца при миграции и rake db:migrate . Это оно

И вы можете написать другую миграцию, чтобы переименовать столбец

 def change
    rename_column :table_name, :old_name, :new_name
  end

Это оно.


Если данные не важны для вас, вы можете просто удалить исходную миграцию, используя:

rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'

Без кавычек, внесите изменения в первоначальную миграцию и снова выполните перенастройку:

rake db:migrate

ИМО, в этом случае, лучше использовать rake db:rollback . Затем отредактируйте свою миграцию и снова введите rake db:migrate . Однако, если у вас есть данные в столбце, который вы не хотите потерять, используйте rename_column .


Из API:

rename_column(table_name, column_name, new_column_name)

Он переименовывает столбец, но сохраняет тип и содержимое.


Некоторые версии Ruby on Rails поддерживают метод up / down для миграции, и если у вас есть метод up / down в вашей миграции, тогда:

def up
    rename_column :table_name, :column_old_name, :column_new_name
end

def down
    rename_column :table_name, :column_new_name, :column_old_name
end

Если у вас есть способ change в вашей миграции, то:

def change
    rename_column :table_name, :column_old_name, :column_new_name
end

Для получения дополнительной информации вы можете перемещаться: Ruby on Rails - Миграции или Миграции Active Record .


Откройте консоль Ruby on Rails и введите:

ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column

Просто создайте новую миграцию, а в блоке используйте rename_column как rename_column ниже.

rename_column :your_table_name, :hased_password, :hashed_password

У вас есть два способа сделать это:

  1. В этом типе он автоматически запускает обратный код, когда откатывается.

    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
  2. Для этого типа он запускает метод, когда rake db:migrate и запускает метод down, когда rake db:rollback :

    def self.up
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
    def self.down
      rename_column :table_name,:new_column_name,:old_column_name
    end
    


Обновление . Близким родственником create_table является change_table, используемая для изменения существующих таблиц. Он используется аналогично create_table, но объект, полученный блоку, знает больше трюков. Например:

class ChangeBadColumnNames < ActiveRecord::Migration
  def change
    change_table :your_table_name do |t|
      t.rename :old_column_name, :new_column_name
    end
  end
end

Этот способ более эффективен, если мы делаем это с другими альтернативными методами, такими как: удалить / добавить индекс / удалить индекс / добавить столбец, например, мы можем сделать следующее:

# Rename
t.rename :old_column_name, :new_column_name
# Add column
t.string :new_column
# Remove column
t.remove :removing_column
# Index column
t.index :indexing_column
#...

Создание миграции Ruby on Rails :

$:> rails g migration Fixcolumnname

Вставить код в файл миграции (XXXXXfixcolumnname.rb) :

class Fixcolumnname < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end

rename_column :table, :old_column, :new_column

Обновить:

Вероятно, вы захотите создать отдельную миграцию для этого. (Переименуйте имя FixColumnName, как вы это сделаете)

script/generate migration FixColumnName
# creates  db/migrate/xxxxxxxxxx_fix_column_name.rb

Затем отредактируйте миграцию, чтобы выполнить свою волю.

# db/migrate/xxxxxxxxxx_fix_column_name.rb
class FixColumnName < ActiveRecord::Migration
  def self.up
    rename_column :table_name, :old_column, :new_column
  end

  def self.down
    # rename back if you need or do something else or do nothing
  end
end

Обновление для Rails 3.1

Хотя методы up и down прежнему применяются. Rails 3.1 получает метод change который «знает, как перенести вашу базу данных и отменить ее, когда миграция откатывается без необходимости писать отдельный метод вниз»

rails g migration FixColumnName

class FixColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

Если вам удастся переименовать целую кучу столбцов или что-то, что потребовало бы повторения имени таблицы снова и снова.

rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...

Вы можете использовать change_table чтобы держать вещи немного опрятными.

class FixColumnNames < ActiveRecord::Migration
  def change
    change_table :table_name do |t|
      t.rename :old_column1, :new_column1
      t.rename :old_column2, :new_column2
      ...
    end
  end
end

Спасибо, Luke && Turadg , за то, что вы подняли тему.

Затем просто db:migrate как обычно, или как бы вы ни делали свой бизнес.

Обновление для Rails 4

При создании Migration для переименования столбца Rails 4 генерирует метод change вместо up и down как указано в приведенном выше ответе. Сгенерированный метод change выглядит следующим образом:

$ > rails g migration ChangeColumnName

который создаст файл миграции, подобный этому:

class ChangeColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end






migration