sql >> Base de Datos >  >> RDS >> PostgreSQL

Los rieles cambian el tipo de columna y actualizan los valores de columna

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