Puede hacerlo de una vez con bastante facilidad utilizando la cláusula USING de ALTER MESA :
Una simple conversión de tipo SQL te dejaría con las cadenas 'true'
y 'false'
por lo que desea agregar un USING. Omitiría AR y lo haría 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 para ti es el using case ...
parte al final. Puede usarlo junto con el AR-ish habitual change_column
engañando a AR para que haga lo correcto:
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
Tenga en cuenta que estoy usando text
como el tipo de columna. Rails usará varchar(255)
dentro de la base de datos cuando dices :string
sin límite, eso es bastante inútil con PostgreSQL ya que maneja el almacenamiento para todos los tipos de cadena prácticamente lo mismo internamente
, las restricciones de longitud en char(n)
y varchar(n)
en realidad los hace más caros de usar que text
. Entonces solo el tiempo :string
tiene sentido con PostgreSQL es cuando tiene una razón para incluir un :limit
específico (y luego un text
columna con un CHECK
la restricción en la longitud tendría más sentido, pero AR es demasiado tonto para saber cosas "avanzadas" como CHECK
restricciones).