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