PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Rails altera o tipo de coluna e atualiza os valores da coluna


Você pode fazer isso de uma só vez com bastante facilidade usando a cláusula USING de ALTER TABELA :

Uma simples conversão de tipo SQL deixaria você com as strings 'true' e 'false' então você deseja adicionar um USING. Eu ignoraria o AR e faria isso manualmente:
connection.execute(%q(
  alter table users
  alter column active
  type text
  using case when active then 'active' else 'inactive' end
))

A parte importante para você é o using case ... parte no final. Você pode usar isso junto com o usual AR-ish change_column coisas enganando o AR para fazer a coisa certa:
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

Observe que estou usando text como o tipo de coluna. Rails usará varchar(255) dentro do banco de dados quando você diz :string sem limite, isso é bastante inútil com o PostgreSQL, pois lida com o armazenamento para todos os tipos de string praticamente o mesmo internamente , as restrições de comprimento em char(n) e varchar(n) na verdade, torná-los mais caros de usar do que text . Então só tempo :string faz sentido com o PostgreSQL é quando você tem um motivo para incluir um específico :limit (e então um text coluna com um CHECK restrição no comprimento faria mais sentido, mas AR é muito burro para saber sobre coisas "avançadas" como CHECK restrições).