PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

I binari cambiano il tipo di colonna e aggiornano i valori delle colonne

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