Você pode fazer isso de uma só vez com bastante facilidade usando a cláusula USING de ALTER TABELA :
Uma simples conversão de tipo SQL deixaria você com as strings
'true'
e 'false'
então você deseja adicionar um USING. Eu ignoraria o AR e faria isso manualmente:connection.execute(%q(
alter table users
alter column active
type text
using case when active then 'active' else 'inactive' end
))
A parte importante para você é o
using case ...
parte no final. Você pode usar isso junto com o usual AR-ish change_column
coisas enganando o AR para fazer a coisa certa:class ChangeColumnTypeInUsers < ActiveRecord::Migration
def up
change_column :users, :active, "text using case when active then 'active' else 'inactive' end"
end
def down
change_column :users, :active, "boolean using active = 'active'"
end
end
Observe que estou usando
text
como o tipo de coluna. Rails usará varchar(255)
dentro do banco de dados quando você diz :string
sem limite, isso é bastante inútil com o PostgreSQL, pois lida com o armazenamento para todos os tipos de string praticamente o mesmo internamente
, as restrições de comprimento em char(n)
e varchar(n)
na verdade, torná-los mais caros de usar do que text
. Então só tempo :string
faz sentido com o PostgreSQL é quando você tem um motivo para incluir um específico :limit
(e então um text
coluna com um CHECK
restrição no comprimento faria mais sentido, mas AR é muito burro para saber sobre coisas "avançadas" como CHECK
restrições).