PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Les rails modifient le type de colonne et mettent à jour les valeurs de colonne

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