PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rails ändern den Spaltentyp und aktualisieren die Spaltenwerte

Sie können dies ganz einfach mit der USING-Klausel von ALTER auf einmal tun TABELLE :

Eine einfache SQL-Typumwandlung würde Sie mit den Zeichenfolgen 'true' belassen und 'false' Sie möchten also ein USING hinzufügen. Ich würde AR umgehen und es von Hand machen:

connection.execute(%q(
  alter table users
  alter column active
  type text
  using case when active then 'active' else 'inactive' end
))

Der für Sie wichtige Teil ist der using case ... Teil am Ende. Sie können das zusammen mit dem üblichen AR-artigen change_column verwenden Dinge, indem sie AR dazu verleiten, das Richtige zu tun:

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

Beachten Sie, dass ich text verwende als Spaltentyp. Rails verwendet varchar(255) in der Datenbank, wenn Sie :string sagen ohne Limit, das ist mit PostgreSQL ziemlich sinnlos, da es den Speicher für alle String-Typen ziemlich gleich handhabt intern , die Längenbeschränkungen für char(n) und varchar(n) machen sie tatsächlich teurer in der Verwendung als text . Dann nur mal :string mit PostgreSQL sinnvoll ist, wenn Sie einen bestimmten Grund haben, ein bestimmtes :limit einzuschließen (und dann ein text Spalte mit einem CHECK Eine Einschränkung der Länge wäre sinnvoller, aber AR ist zu dumm, um etwas über "erweiterte" Dinge wie CHECK zu wissen Beschränkungen).