sql >> Databasteknik >  >> RDS >> PostgreSQL

Rails ändrar kolumntyp och uppdaterar kolumnvärden

Du kan göra det på en gång ganska enkelt genom att använda USING-satsen i ALTER TABELL :

En enkel cast av SQL-typ skulle lämna dig med strängarna 'true' och 'false' så du vill lägga till en USING. Jag skulle kringgå AR och göra det för hand:

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

Den viktiga delen för dig är using case ... del i slutet. Du kan använda det tillsammans med den vanliga AR-ish change_column saker genom att lura AR att göra det rätta:

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

Observera att jag använder text som kolumntyp. Rails kommer att använda varchar(255) inuti databasen när du säger :string utan gräns, det är ganska meningslöst med PostgreSQL eftersom det hanterar lagringen för alla strängtyper ganska likadant internt , längdbegränsningarna för char(n) och varchar(n) gör dem faktiskt dyrare att använda än text . Sedan bara tid :string vettigt med PostgreSQL är när du har en anledning att inkludera en specifik :limit (och sedan en text kolumn med en CHECK begränsning av längden skulle vara mer vettigt men AR är för dumt för att veta om "avancerade" saker som CHECK begränsningar).



  1. Omedelbar filinitiering:Inverkan under installationen

  2. Uppdatera/Uppdatera en formulärskärm i Oracle D2k Forms 6i

  3. Visa Dynamic EXECUTE Output inom pl/sql Från sqlplus

  4. Kombinera två tabeller, exkludera samma poster