Je kunt het vrij eenvoudig in één keer doen met behulp van de USING-clausule van ALTER TABEL :
Een eenvoudige cast van het SQL-type zou je achterlaten met de strings 'true'
en 'false'
dus je wilt wel een USING toevoegen. Ik zou AR omzeilen en het met de hand doen:
connection.execute(%q(
alter table users
alter column active
type text
using case when active then 'active' else 'inactive' end
))
Het belangrijkste onderdeel voor jou is de using case ...
deel aan het einde. Je kunt dat gebruiken samen met de gebruikelijke AR-achtige change_column
dingen door AR te misleiden om het juiste te doen:
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
Let op:ik gebruik text
als het kolomtype. Rails gebruikt varchar(255)
binnen de database als je zegt :string
zonder limiet is dat vrij zinloos met PostgreSQL omdat het de opslag voor alle stringtypes afhandelt vrijwel hetzelfde intern
, de lengtebeperkingen op char(n)
en varchar(n)
maken ze eigenlijk duurder in gebruik dan text
. Dan alleen tijd :string
zinvol is met PostgreSQL is wanneer u een reden hebt om een specifieke :limit
op te nemen (en dan een text
kolom met een CHECK
beperking van de lengte zou logischer zijn, maar AR is te dom om iets te weten over "geavanceerde" dingen zoals CHECK
beperkingen).