Міграція рейок: самовгору та самозниження проти змін


86

Схоже, нова версія рейок має "зміну" в порівнянні із методами self.up та self.down.

Отже, що відбувається, коли потрібно відкочувати міграцію, як він знає, які дії робити. У мене є такий метод, який мені потрібно реалізувати на основі підручника в Інтернеті:

class AddImageToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :image_file_name, :string
    add_column :users, :image_content_type, :string
    add_column :users, :image_file_size, :integer
    add_column :users, :image_updated_at, :datetime
  end

  def self.down
    remove_column :users, :image_file_name, :string
    remove_column :users, :image_content_type, :string
    remove_column :users, :image_file_size, :integer
    remove_column :users, :image_updated_at, :datetime
  end    
end

Як я можу зробити те саме за допомогою нового методу змін?


Відповіді:


110

Для багатьох операцій рейки можуть здогадатися, що таке зворотна операція (без проблем). Наприклад, у вашому випадку, що таке зворотна операція add_columnвиклику при відкаті? Звичайно remove_column. До чого зворотне create_table? Це drop_table. Отже, у цих випадках рейки знають, як відкотитись і визначити downметод, є зайвим (ви можете бачити в документації методи, які зараз підтримуються методом зміни ).

Але зверніть увагу, тому що для якоїсь операції вам все-таки потрібно визначити downметод , наприклад, якщо ви змінюєте точність десяткового стовпця, як вгадати початкову точність при відкаті? Це неможливо, тому вам потрібно визначити downметод.

Як вже було сказано, я пропоную вам прочитати Посібник із міграції Rails .


33

Краще використовувати Вгору, Вниз, Змінити:

On Rails 3 (Reversible): який повинен додати новий стовпець вгору і заповнити всі записи в таблиці лише вгору, а цей стовпець видалити лише вгору

def up
  add_column :users, :location, :string
  User.update_all(location: 'Minsk')
end

def down
  remove_column :users, :location
end

Але:

Вам довелося уникати використання методу змін, який дозволяє заощадити час. Наприклад, якщо вам не потрібно було оновлювати значення стовпця відразу після його додавання, ви скоротили б цей код таким чином:

def change
  add_column :users, :location, :string
end

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

На Rails 4: ще один корисний спосіб написати те, що нам потрібно, в одному місці:

def change
  add_column :users, :location, :string
  reversible do |direction|
    direction.up { User.update_all(location: 'Minsk') }
  end
end

Гарне пояснення, брате
Бібек Шарма

повернення? також є хорошим способом сказати напрямок,
куди ви рухаєтесь

Нічого з цього не працює. Я просто продовжую отримувати ActiveRecord::IrreversibleMigration.
Викинути рахунок

бувають ситуації, коли рейки не можуть відкотити міграцію. будь ласка, перегляньте їхню допомогу
Kaleem Ullah

1
class AddImageToUsers < ActiveRecord::Migration
  def change
    add_column :users, :image_file_name, :string
    add_column :users, :image_content_type, :string
    add_column :users, :image_file_size, :integer
    add_column :users, :image_updated_at, :datetime
  end
end

Спасибі. Але що могло б статися, якби ти відкотився. знало б, що робити?
banditKing

3
Я проспав. Альдо 'xoen' Джамбеллука все пояснює.
нічого особливого - тут
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.