Du kan göra det på en gång ganska enkelt genom att använda USING-satsen i ALTER TABELL :
En enkel cast av SQL-typ skulle lämna dig med strängarna 'true' och 'false' så du vill lägga till en USING. Jag skulle kringgå AR och göra det för hand:
connection.execute(%q(
alter table users
alter column active
type text
using case when active then 'active' else 'inactive' end
))
Den viktiga delen för dig är using case ... del i slutet. Du kan använda det tillsammans med den vanliga AR-ish change_column saker genom att lura AR att göra det rätta:
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
Observera att jag använder text som kolumntyp. Rails kommer att använda varchar(255) inuti databasen när du säger :string utan gräns, det är ganska meningslöst med PostgreSQL eftersom det hanterar lagringen för alla strängtyper ganska likadant internt
, längdbegränsningarna för char(n) och varchar(n) gör dem faktiskt dyrare att använda än text . Sedan bara tid :string vettigt med PostgreSQL är när du har en anledning att inkludera en specifik :limit (och sedan en text kolumn med en CHECK begränsning av längden skulle vara mer vettigt men AR är för dumt för att veta om "avancerade" saker som CHECK begränsningar).