25 ответов:
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методы все еще применяются. Рельсы 3.1 получаетchangeметод "знает, как перенести вашу базу данных и отменить его, когда миграция откатывается без необходимости записывать отдельный метод down"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
ИМО, в этом случае лучше использовать
rake db:rollback. Затем отредактируйте миграцию и снова введитеrake db:migrate. Однако, если у вас есть данные в столбце, который вы не хотите потерять, используйтеrename_column.
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
под
Available Transformations
rename_column(table_name, column_name, new_column_name):переименовывает столбец, но сохраняет тип и содержание.
если столбец уже заполнен данными и живет в производстве, я бы рекомендовал пошаговый подход, чтобы избежать простоя в производстве во время ожидания миграции.
сначала я бы создал миграцию БД, чтобы добавить столбцы с новыми именами и заполнить их значениями из старого имени столбца.
class AddCorrectColumnNames < ActiveRecord::Migration def up add_column :table, :correct_name_column_one, :string add_column :table, :correct_name_column_two, :string puts 'Updating correctly named columns' execute "UPDATE table_name SET correct_name_column_one = old_name_column_one, correct_name_column_two = old_name_column_two" end end def down remove_column :table, :correct_name_column_one remove_column :table, :correct_name_column_two end endтогда я бы совершил именно это изменение и подтолкнул изменение к производству.
git commit -m 'adding columns with correct name'затем, как только фиксация была нажата в производство я бы побежал.
Production $ bundle exec rake db:migrateзатем я бы обновил все представления / контроллеры, которые ссылались на старое имя столбца, на новое имя столбца. Запустите мой набор тестов и зафиксируйте только эти изменения. (Убедившись, что он работает локально и проходит все тесты в первую очередь!)
git commit -m 'using correct column name instead of old stinky bad column name'тогда я бы подтолкнул это обязательство к производству.
в этот момент Вы можете удалить исходный столбец, не беспокоясь о каких-либо простоев, связанных с миграцией себя.
class RemoveBadColumnNames < ActiveRecord::Migration def up remove_column :table, :old_name_column_one remove_column :table, :old_name_column_two end def down add_column :table, :old_name_column_one, :string add_column :table, :old_name_column_two, :string end endзатем нажмите эту последнюю миграцию в производство и запустите
bundle exec rake db:migrateв фоновом режиме.Я понимаю, что это немного больше связано с процессом, но я бы предпочел сделать это, чем иметь проблемы с моей производственной миграцией.
выполните команду ниже, чтобы создать файл миграции:
rails g migration ChangeHasedPasswordToHashedPasswordзатем в файле, созданном в пишите
rename_columnкак показано ниже:class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration def change rename_column :table_name, :hased_password, :hashed_password end end
от 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-миграции или Миграция Активных Записей.
Если ваш код не поделился с другим, то лучший вариант-сделать просто
rake db:rollbackзатем измените имя столбца в миграции иrake db:migrate. Вот онои вы можете написать другую миграцию, чтобы переименовать столбец
def change rename_column :table_name, :old_name, :new_name endвот и все.
Если вам нужно переключить имена столбцов, вам нужно будет создать заполнитель, чтобы избежать дублировать имя столбца ошибка. Вот пример:
class SwitchColumns < ActiveRecord::Migration def change rename_column :column_name, :x, :holder rename_column :column_name, :y, :x rename_column :column_name, :holder, :y end end
в качестве альтернативного варианта, если вы не женаты на идее миграции, есть убедительный драгоценный камень для ActiveRecord, который будет обрабатывать изменения имени автоматически для вас, стиль Datamapper. Все, что вам нужно сделать, это изменить имя столбца в вашей модели (и убедитесь, что вы положили модель.auto_upgrade! в нижней части модели.РБ) и Виола! База данных обновляется на лету.
https://github.com/DAddYE/mini_record
Примечание: вам понадобится на ядерную бомбу db / schema.РБ для предотвращения конфликтов
все еще в бета-фазах и, очевидно, не для всех, но все еще убедительный выбор (в настоящее время я использую его в двух нетривиальных производственных приложениях без проблем)
если текущие данные не важны для вас, вы можете просто снять исходную миграцию с помощью:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'без кавычек, затем внесите изменения в исходную миграцию и снова запустите миграцию вверх:
rake db:migrate
просто создайте новую миграцию и в блоке используйте
rename_columnКак ниже.rename_column :your_table_name, :hased_password, :hashed_password
вручную мы можем использовать следующий метод:
мы можем редактировать миграцию вручную, например:
открыть
app/db/migrate/xxxxxxxxx_migration_file.rbобновление
hased_passwordдоhashed_passwordвыполните следующую команду
$> rake db:migrate:down VERSION=xxxxxxxxxзатем он удалит вашу миграцию:
$> rake db:migrate:up VERSION=xxxxxxxxxОн добавит вашу миграцию с обновленным изменением.
создать файл миграции:
rails g migration FixName# создает db / migrate / xxxxxxxxxx.РБ
изменить миграцию, чтобы сделать вашу волю.
class FixName < ActiveRecord::Migration def change rename_column :table_name, :old_column, :new_column end end
$: rails g migration RenameHashedPasswordColumn invoke active_record create db/migrate/20160323054656_rename_hashed_password_column.rbОткройте этот файл миграции и измените его, как показано ниже(введите исходный
table_name)class RenameHashedPasswordColumn < ActiveRecord::Migration def change rename_column :table_name, :hased_password, :hashed_password end end
выполнить
rails g migration ChangesNameInUsers(или как бы вы его ни называли)откройте только что созданный файл миграции и добавьте эту строку в метод (между
def changeиend):
rename_column :table_name, :the_name_you_want_to_change, :the_new_nameсохраните файл и запустите
rake db:migrateв консолиПроверьте ваш
schema.dbдля того, чтобы увидеть, если имя изменилось в базе данных!надеюсь, что это помогает :)
создать Ruby on Rails миграции:
$:> rails g migration Fixcolumnnameвставить код в файл миграции (XXXXXfixcolumnname.РБ):
class Fixcolumnname < ActiveRecord::Migration def change rename_column :table_name, :old_column, :new_column end end
Откройте консоль Ruby on Rails и введите:
ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
у вас есть два способа сделать это:
в этом типе он автоматически выполняет обратный код его, когда откат.
def change rename_column :table_name, :old_column_name, :new_column_name endдля этого типа, он запускает метод, когда
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
Я на рельсах 5.2, и пытаюсь переименовать столбец на пользователя devise.
the
rename_columnбит работал для меня, но единственное:table_nameкинул "таблица не найдена" ошибка. Множественное число работало на меня.rails g RenameAgentinUserзатем измените файл миграции для этого:
rename_column :users, :agent?, :agentгде :агент? это старое имя столбца.
просто создайте миграцию с помощью команды
rails g migration rename_hased_passwordпосле этого отредактируйте миграцию добавьте следующую строку в методе изменения
rename_column :table, :hased_password, :hashed_passwordЭто должно сделать трюк.
Rails 5 миграционные изменения
например:
рельсы G модель студент имя_студента: строка возраст: целое число
Если вы хотите изменить student_name
обновление - близким родственником 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этот способ более эффективен, если мы делаем с другими методами alter, такими как: remove / add index/remove index / add column, например, мы можем сделать дальше, как:
# 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 #...
Comments