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