Vous pouvez le faire en une fois assez facilement en utilisant la clause USING de ALTER TABLE :
Un simple cast de type SQL vous laisserait avec les chaînes 'true'
et 'false'
vous voulez donc ajouter un USING. Je contournerais AR et le ferais à la main :
connection.execute(%q(
alter table users
alter column active
type text
using case when active then 'active' else 'inactive' end
))
La partie importante pour vous est le using case ...
partie à la fin. Vous pouvez l'utiliser avec l'habituel AR-ish change_column
trucs en incitant AR à faire la bonne chose :
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
Notez que j'utilise text
comme type de colonne. Les rails utiliseront varchar(255)
à l'intérieur de la base de données lorsque vous dites :string
sans limite, c'est assez inutile avec PostgreSQL car il gère le stockage pour tous les types de chaînes à peu près la même chose en interne
, les restrictions de longueur sur char(n)
et varchar(n)
les rendent en fait plus chers à utiliser que text
. Alors seulement le temps :string
est logique avec PostgreSQL lorsque vous avez une raison d'inclure un :limit
spécifique (puis un text
colonne avec un CHECK
une contrainte sur la longueur aurait plus de sens mais AR est trop stupide pour connaître des choses "avancées" comme CHECK
contraintes).