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