Skip to content

Instantly share code, notes, and snippets.

@HendrikPetertje
Last active August 29, 2015 14:04
Show Gist options
  • Save HendrikPetertje/eaf7b942b2f732a70ca5 to your computer and use it in GitHub Desktop.
Save HendrikPetertje/eaf7b942b2f732a70ca5 to your computer and use it in GitHub Desktop.
Een column aanpassen in je app

Een column naam veranderen in je DB zonder oude omgevingen kappot te maken en data te behouden

1 maak een migratie met de naam van je nieuwe column.. in dit geval test_number in tabel Article die al test heeft

rails g migration AddTestNumberToArticle test_number:integer

2 maak een migratie waarin je een task gaat zetten

rails g migration ChangeArticle

3 Voeg een taak toe aan je gegenereerde migratie

class ChangeArticle < ActiveRecord::Migration
  def self.up
    Article.all.each do |a|
      a.test_number = a.test.to_i unless a.test_number.present?
      puts "#the test_number in Article {a.id} was copied back to test"
      a.save
      puts "#the test in Article {a.id} was copied to test_number"
    end
  end

  def self.down
    Article.all.each do |a|
      a.test_number = a.test.to_i unles a.test_number.present?
      a.test = a.test_number.to_s
      a.save
      puts "#the test_number in Article {a.id} was copied back to test" 
    end
  end

in self.up en self.down wordt er voor gezorgt dat beide tabellen steeds inhoud hebben. in self.down (uitgevoerd als een migratie teruggedraaid wordt met `rake db:rollback') wordt er voor gezorgt dat alle beide de columns de zelfde inhoud hebben en oude code in de app wel blijft werken.

4 Na verloop van tijd...

Geef het een paar weken, mag de oude column weggegooit worden met rails g migration RemoveTestFromArticle test:string. Doe dit echter pas als uit tests gebleken is, dat je nieuwe code 200% werkt (100% plus al je specs).

5 ?

Lees het nog eens allemaal en ga het maar uitvoeren

6 Profit

Goed gedaan!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment