Я неправильно назвав стовпчик hased_passwordзамість hashed_password.
Як оновити схему бази даних, використовуючи міграцію для перейменування цього стовпця?
Я неправильно назвав стовпчик hased_passwordзамість hashed_password.
Як оновити схему бази даних, використовуючи міграцію для перейменування цього стовпця?
Відповіді:
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
Тоді просто db:migrate як зазвичай, або все-таки ви займаєтеся своїм бізнесом.
Для рейок 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
self.upя б не сказав self.down" завжди має бути протилежним". Це залежить від контексту вашої міграції. Просто встановлення "протилежного" може бути не "правильним" вниз міграцією.
def self.upі def self.downна, def changeі він буде знати, як відкати.
changeметод не є повним доказом, тому, як правило, використовують upі downметоди складних міграцій.
На мою думку, у цьому випадку краще скористатися rake db:rollback, а потім відредагувати міграцію та знову запустити rake db:migrate.
Однак якщо у вас є дані в стовпці, які ви не хочете втрачати, тоді використовуйте rename_column.
Якщо стовпець уже заповнений даними та працює у виробництві, я рекомендую покроковий підхід, щоб уникнути простоїв у виробництві під час очікування міграцій.
Спочатку я б створив db міграцію, щоб додати стовпці з новими іменами та заповнити їх значеннями зі старої назви стовпців.
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у фоновому режимі.
Я усвідомлюю, що це трохи більше пов'язаний з процесом, але я б краще зробив це, ніж виникли проблеми з міграцією виробництва.
execute "Update table_name set correct_name_column_one = old_name_column_one"
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Під Available Transformations
rename_column(table_name, column_name, new_column_name):
Перейменує стовпець, але зберігає тип та зміст.
rename_column .
Запустіть команду нижче, щоб створити файл міграції:
rails g migration ChangeHasedPasswordToHashedPassword
Потім у файл, згенерований у db/migrateпапці, запишіть rename_columnтак:
class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
Деякі версії Ruby on Rails підтримують спосіб переходу вгору / вниз, і якщо у вас є метод вгору / вниз для міграції, то:
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
Це воно.
rake db:rollbackє чудовою пропозицією. Але, як ви сказали, лише якщо міграція ще не була натиснута.
Як альтернативний варіант, якщо ви не одружені з ідеєю міграцій, є переконливий дорогоцінний камінь для ActiveRecord, який автоматично обробляє зміни імені для вас, стиль Datamapper. Все, що вам потрібно зробити - це змінити назву стовпця у вашій моделі (і переконайтеся, що ви поставили Model.auto_upgrade! Внизу вашого model.rb) та віолу! База даних оновлюється на льоту.
https://github.com/DAddYE/mini_record
Примітка. Щоб запобігти конфліктам, вам потрібно буде запустити db / schema.rb
Все ще в бета-фазах і, очевидно, не для всіх, але все ж переконливий вибір (я зараз використовую його в двох нетривіальних виробничих додатках без проблем)
Якщо вам потрібно переключити назви стовпців, вам потрібно створити заповнювач, щоб уникнути помилки дублювання імені стовпця . Ось приклад:
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
Якщо наявні дані для вас не важливі, ви можете просто зняти оригінальну міграцію, використовуючи:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
Без лапок, потім внесіть зміни в початкову міграцію та знову запустіть перехідну версію за допомогою:
rake db:migrate
Для Ruby on Rails 4:
def change
rename_column :table_name, :column_name_old, :column_name_new
end
Вручну ми можемо використовувати наступний метод:
Ми можемо редагувати міграцію вручну так:
відчинено 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 ChangesNameInUsers(або як би ви хотіли його назвати)
Відкрийте щойно створений файл міграції та додайте цей рядок у спосіб (між def changeта end):
rename_column :table_name, :the_name_you_want_to_change, :the_new_name
Збережіть файл та запустіть rake db:migrateу консолі
Перевірте свою schema.db, щоб побачити, чи дійсно ім’я змінилося в базі даних!
Сподіваюся, це допомагає :)
Давайте KISS . Все, що потрібно, - це три простих кроки. Наступні роботи для Rails 5.2 .
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName- таким чином, цілком зрозуміло, що надалі підтримуватимуть кодову базу. (використовуйте множину для назви таблиці).
# I prefer to explicitly write theвгору andвнизmethods.
# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb
class RenameNameToFullNameInStudents < ActiveRecord::Migration[5.2]
def up
# rename_column :table_name, :old_column, :new_column
rename_column :students, :name, :full_name
end
def down
# Note that the columns are reversed
rename_column :students, :full_name, :name
end
end
rake db:migrate
І ви їдете на перегони!
$: 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
Відкрийте консоль 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Для цього типу він запускає метод up коли 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 і намагаюся перейменувати стовпчик на призначеного користувача.
rename_columnтрохи працював для мене, але в однині :table_nameкинув «таблиці користувача не знайдений» помилка. Множина працювала на мене.
rails g RenameAgentinUser
Потім змініть файл міграції на це:
rename_column :users, :agent?, :agent
Де: агент? - стара назва стовпця.
Оновлення - Близький родич create_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
#...
Просто генеруйте міграцію за допомогою команди
rails g migration rename_hased_password
Після цього відредагуйте міграцію, додайте наступний рядок у способі зміни
rename_column :table, :hased_password, :hashed_password
Це повинно зробити трюк.
Рейки 5 міграційних змін
наприклад:
rails g модель Студентське ім'я студента: вік рядка: ціле число
якщо ви хочете змінити стовпець імені студента як ім'я
Примітка: - якщо ви не запустите рейки db: migrate
Ви можете виконати наступні дії
rails d модель Студентське ім'я студента: строковий вік: ціле число
Це видалить створений файл міграції, тепер ви можете виправити ім'я стовпця
rails g модель Ім'я студента: string string: integer
Якщо ви мігрували (rails db: migrate), дотримуйтесь параметрів, щоб змінити назву стовпця
rails g міграція RemoveStudentNameFromStudent_імен__код: строка
rails g міграція AddNameToStudent ім'я: string
rails g migration RemoveStudentNameFromStudentS student_name:string(учні множини)?