Du kan gøre det på én gang ganske nemt ved at bruge USING-sætningen af ALTER TABEL :
En simpel SQL-type cast ville efterlade dig med strengene 'true'
og 'false'
så du ønsker at tilføje en USING. Jeg ville omgå AR og gøre det i hånden:
connection.execute(%q(
alter table users
alter column active
type text
using case when active then 'active' else 'inactive' end
))
Den vigtige del for dig er using case ...
del til sidst. Du kan bruge det sammen med den sædvanlige AR-ish change_column
ting ved at narre AR til at gøre det rigtige:
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
Bemærk, at jeg bruger text
som kolonnetype. Rails vil bruge varchar(255)
inde i databasen, når du siger :string
uden en grænse, det er ret meningsløst med PostgreSQL, da det håndterer lagringen for alle strengtyperne stort set det samme internt
, længdebegrænsningerne på char(n)
og varchar(n)
gør dem faktisk dyrere at bruge end text
. Derefter kun tid :string
giver mening med PostgreSQL er, når du har en grund til at inkludere en specifik :limit
(og derefter en text
kolonne med en CHECK
begrænsning af længden ville give mere mening, men AR er for dum til at vide om "avancerede" ting som CHECK
begrænsninger).