O adaptador de MySQL do ActiveRecord ficou um pouco mais esperto na hora de criar ou alterar colunas no banco de dados usando inteiros. De acordo com a opção :limit, ele define se a coluna será um smallint, int ou bigint. Veja um trecho do código que faz isto:
case limit
when 0..3
"smallint()"
when 4..8
"int()"
when 9..20
"bigint()"
else
'int(11)'
end
O trecho acima foi extraído do arquivo activerecord/lib/active_record/connection_adapters/mysql_adapter.rb à partir da linha 470.
Para ficar mais claro, vamos mapear isto em um migration e ver que tipo de coluna será criado para cada caso:
create_table :table_name, :force => true do |t|
# de 0 à 3: smallint
t.integer :coluna1, :limit => 2 # smallint(2)
# de 4 à 8: int
t.integer :coluna2, :limit => 6 # int(6)
# de 9 à 20: bigint
t.integer :coluna3, :limit => 15 # bigint(15)
# se a opção :limit não for informada: int(11)
t.integer :coluna4 # int(11)
end
O adaptador do PostgreSQL já fazia assim, o do MySQL apenas seguiu a tendência.