Modificadores de Migrações em Active Record

Dicas - 11/Nov/2019 - por Henrique Morato

Em uma aplicação Ruby on Rails, quando vamos gerar migrations várias vezes queremos que os atributos a ser gerados tenham limite, precisão, entre outras opções.

Para facilitar essa modificação o Rails criou os type modifiers.

Abaixo temos uma migration de exemplo usando estes modificadores:

rails g migration add_attributes_to_some_table pseudo:string{50} 'decimal_number:decimal{4,2}' \
username:string{30}:uniq commentable:belongs_to{polymorphic}

Note que quando usamos a notação {4,2} esta parte está dentro de aspas porque o bash, o zsh e outros Shells mapeiam esse tipo de comando para decimal4 e decimal2 caso isso não seja feito.

Que gera a seguinte migration:

class AddAttributesToSomeTable < ActiveRecord::Migration[6.0]
  def change
    add_column :some_tables, :pseudo, :string, limit: 50
    add_column :some_tables, :decimal_number, :decimal, precision: 4, scale: 2
    add_column :some_tables, :username, :string, limit: 30
    add_index :some_tables, :username, unique: true
    add_reference :some_tables, :commentable, polymorphic: true, null: false
  end
end

Em colunas do tipo string, text, binary ou integer o modificador altera o limite. Nas colunas do tipo decimal podemos alterar a precisão e escala. Em colunas do tipo belongs_to (ou references) podemos incluir a mudança para polymorphic association.

Além disso temos o :uniq, que não permite valores duplicados e :index, que inclui um índice para este campo.

Outra opção interessante é o comment, null e default que não tem opção de uso com os geradores mas podemos editar no arquivo, exemplo abaixo:

class AddAttributesToSomeTable < ActiveRecord::Migration[6.0]
  def change
    add_column :some_tables, :pseudo, :string, comment: 'Pseudo text for an attribute'
    add_column :some_tables, :a_number, :integer, null: 0, default: 0
  end
end

Referências