Migracja bazy, problem z id

witam
migruje aplikacje phpową na railsy, problem jest z bazą. Zrobiłem rake script który kopiuje dane między tabelami, ale nie udało mi sie dojść jak skopiować id, albo ustawiają się kolejne, a w starej bazie nie są one ciągłe, albo gdy recznie zdejmę z kolumny id atrybut auto increment, to id ustawia sie zawsze na 0

Udało mi się dojść do tego że jeśli użyje new, ustawie w nowym obiekcie id i potem save to jest ok i nie trzeba nic zmieniać w bazie. Przy create jak w poście wyżej. Czemu tak się dzieje ?

Bo rails chroni główny atrybut (zwykle id, ale chodzi o dowolny klucz główny) przed modyfikacją przez tak zwany mass-assign. Ma to na celu utrudnienie ataków typu SQL injection, gdzie formularz do aktualizacji rekordu modyfikowany jest by zmienił też klucz obcy, co w najlepszym wypadku spowoduje wypieprzenie się aplikacji po głosnym protescie bazy danych że klucz głowny został zduplikowany, a w najgorszym utracenie spójności danych oraz udostepnienie tajnych danych.

Nie wygodniej migrować takie bazy danych używając po prostu skryptów Ruby+SQL?

Świstak: dzięki, teraz rozumiem, jak wspomniałem działa z new i save
nagl: przed zapisem chce się upewnić ze modele będą zwalidowane

Ja do takich celów używam Sequela (https://github.com/jeremyevans/sequel). Czyli w ActiveRecord mam modele nowej aplikacji, a Sequelem podłączam się do starej bazy. Sequel jest bardzo elastyczny, więc w niczym nie wejdzie w drogę. Wystarczy, że pobierzesz ze starej aplikacji odpowiednie wiersze (wraz z asocjacjami) i je przepiszesz (wraz z asocjacjami) do nowego modelu (najlepiej asocjowane modele tworzyć za pomocą metody build i zapisywać główny obiekt), nie bawiąc się w grzebanie w ID-ach. I to powinno sprawę załatwić – walidacje i callbacki oczywiście bez problemu będą działać.