Friday, June 27, 2008

Migracje w rails 2.1

W nowym wydaniu Railsa w wersji 2.1 w nasze ręce oddana została poprawiona funkcjonalność związana z zarządzaniem migracjami. Poprawione zostały dwie rzeczy. Pierwsza dotyczy generowania samych migracji, które przestały być już oznaczane kolejnymi numerami wersji (stanowiło to czasami nie lada wyzwanie kiedy w projekcie kilka osób jednocześnie pracowało z modelem), a druga możliwości określania zmian w tabelach.

Od wersji rails 2.1 migracje numerowane są tak zwanym stemplem czasowym. W praktyce oznacza to, że wygenerowanie migracji za pomocą script/generate migration nowa_migracja spowoduje utworzenie pliku o nazwie zbliżonej do tej: 20080627102918_nowa_migracja.rb

Wcześniej jeżeli dwie osoby jednocześnie wygenerowały migracje trzeba było cofać wprowadzone zmiany (najlepiej przed pobraniem zmian z SVNa - ponieważ tylko wtedy odbywało się to w miarę bezproblemowo), zmieniać nazwy plików i dopiero wówczas migrować model. Teraz proces ten przeprowadzany jest automatycznie. W momencie w którym rake db:migrate stwierdzi, że w katalogu znajdują się migracje z wcześniejszym stemplem czasowym, cofa wszystkie zmiany, a następnie migruje model z uwzględnieniem wcześniejszej migracji.

Druga zmiana w Railsie 2.1 dotyczy sposobu w jaki możemy definiować zmiany tabel przyjrzyjmy się poniższemu fragmentowi kodu:


change_table :news do |:tabela|
tabela.belongs_to :issue # Doda kolumnę issue_id
tabela.string :naglowek, :autor # Doda dwie kolumny typu string
tabela.remove :header, :author #Usunie dwie kolumny
end



Do dyspozycji mamy teraz następujace modyfikatory dostępne w bloku kodu metody change_table:


  1. tabela.index - dodaje indeks

  2. tabela.change - zmienia definicję kolumny np. tabela.change :nazwa, :string, :limit => 200

  3. tabela.change_default - zmienia wartość domyślną dla kolumny

  4. tabela.rename - zmienia nazwę kolumny

  5. tabela.remove - usuwa kolumnę

  6. tabela.remove_belongs_to - usuwa kolumnę z kluczem obcym

  7. tabela.remove_timestams - stemple czasowe

  8. dodatkowo możemy używać (references, string, text, integer, float, decimal, datetime, timestamps, time, date, binary, boolean)

No comments: