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