Puoi farlo in una volta sola abbastanza facilmente usando la USING clausola di ALTER TABELLA :
Un semplice cast di tipo SQL ti lascerebbe con le stringhe 'true'
e 'false'
quindi vuoi aggiungere un USING. Ignorerei AR e lo farei a mano:
connection.execute(%q(
alter table users
alter column active
type text
using case when active then 'active' else 'inactive' end
))
La parte importante per te è il using case ...
parte alla fine. Puoi usarlo insieme al solito AR-ish change_column
cose inducendo AR a fare la cosa giusta:
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
Nota che sto usando text
come tipo di colonna. Rails utilizzerà varchar(255)
all'interno del database quando dici :string
senza limiti, è abbastanza inutile con PostgreSQL in quanto gestisce l'archiviazione per tutti i tipi di stringhe praticamente lo stesso internamente
, le restrizioni di lunghezza su char(n)
e varchar(n)
in realtà li rendono più costosi da usare rispetto a text
. Quindi solo ora :string
ha senso con PostgreSQL quando hai un motivo per includere uno specifico :limit
(e poi un text
colonna con un CHECK
il vincolo sulla lunghezza avrebbe più senso, ma AR è troppo stupido per sapere cose "avanzate" come CHECK
vincoli).