Миграции Rails: self.up и self.down против изменений


86

Похоже, что в новой версии rails есть методы change по сравнению с методами 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. Таким образом, в этих случаях rails знают, как откатиться, и определить downметод излишни (вы можете увидеть в документации методы, которые в настоящее время поддерживаются из метода изменения ).

Но обратите внимание, потому что для какой-то операции вам все равно нужно определить downметод , например, если вы измените точность десятичного столбца, как угадать исходную точность при откате? Это невозможно, поэтому вам нужно определить downметод.

Как уже было сказано, я предлагаю вам прочитать Руководство по миграции Rails .


33

Лучше использовать Up, Down, Change:

On Rails 3 (обратимый): который должен добавлять новый столбец вверх и заполнять все записи в таблице только вверх, и удалять этот столбец только внизу

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

Вверху он добавит столбец в таблицу и удалит его вниз. Гораздо меньше кода и это прибыль.

On Rails 4: еще один полезный способ написать то, что нам нужно в одном месте:

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

Хорошее объяснение, брат
Бибек Шарма

возвращение? также хороший способ определить направление, в котором вы идете внутри изменения
baash05

Ничего из этого не работает. Я просто продолжаю получать ActiveRecord::IrreversibleMigration.
Выкинуть аккаунт

бывают ситуации, когда рельсы не могут откатить миграцию. пожалуйста, просмотрите их помощь
Калим Уллах

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.