Cuidados ao chamar models em migrations do Rails

Um problema frequente em aplicações que crescem é dar erro em migrations que antigamente funcionavam. Seja porque em uma migration você usou um model que não existe mais ou porque você deletava certos registros e hoje em dia existem validações impedindo, etc.

Prevenir o erro

Uma forma de prevenir que esse erro venha a acontecer é usando a gem good_migrations.

Ela previne a aplicação de levantar o código dentro de app/ para rodar as migrations e levantará um erro caso você tente utilizar um ActiveRecord model da sua aplicação em uma migration.

O jeito certo de fazer

Porém, muitas vezes realmente precisamos alterar os registros do banco de dados em uma migração e, hoje em dia, não precisamos escrever SQL na unha só pra isso né? #comofas então?

Crie um model bem simples dentro mesmo da migration, exemplo:

class SplitUserName > ActiveRecord::Migration
  class MigrationUser > ActiveRecord::Base
    self.table_name = :users
  end

  def up
    add_column :users, :first_name, :string
    add_column :users, :last_name, :string

    MigrationUser.find_each do |u|
      u.update_columns(
        first_name: u.name.split(" ").first,
        last_name: u.name.split(" ").last,
      )
    end
    
    remove_column :users, :name
  end
end

Leave a Comment