sql >> Database >  >> RDS >> PostgreSQL

Rails wijzigen kolomtype en updaten kolomwaarden

Je kunt het vrij eenvoudig in één keer doen met behulp van de USING-clausule van ALTER TABEL :

Een eenvoudige cast van het SQL-type zou je achterlaten met de strings 'true' en 'false' dus je wilt wel een USING toevoegen. Ik zou AR omzeilen en het met de hand doen:

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

Het belangrijkste onderdeel voor jou is de using case ... deel aan het einde. Je kunt dat gebruiken samen met de gebruikelijke AR-achtige change_column dingen door AR te misleiden om het juiste te doen:

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

Let op:ik gebruik text als het kolomtype. Rails gebruikt varchar(255) binnen de database als je zegt :string zonder limiet is dat vrij zinloos met PostgreSQL omdat het de opslag voor alle stringtypes afhandelt vrijwel hetzelfde intern , de lengtebeperkingen op char(n) en varchar(n) maken ze eigenlijk duurder in gebruik dan text . Dan alleen tijd :string zinvol is met PostgreSQL is wanneer u een reden hebt om een ​​specifieke :limit op te nemen (en dan een text kolom met een CHECK beperking van de lengte zou logischer zijn, maar AR is te dom om iets te weten over "geavanceerde" dingen zoals CHECK beperkingen).



  1. Een array van Object doorgeven van Java naar PL/SQL-functie

  2. Miljarden rijen ophalen van een externe server?

  3. Kolom importeren uit CSV in bestaande MySQL-tabel

  4. SQL voor hiërarchische relatie