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).