2013-03-22 13 views
5

Próbuję napisać własną metodę znaczników czasu, która zostanie uruchomiona podczas migracji. Ten, który jest na miejscu, dodaje teraz ograniczenie NOT_NULL na polu i naprawdę tego nie chcę.Railsy/Ruby Jak przesłonić znaczniki czasu metody migracji

Problem polega na tym, że mam bazę danych z wieloma schematami. Gdzie każdy główny klient otrzymuje swój własny schemat. Kiedy wchodzimy na nowego klienta, tworzymy nowy rekord dzierżawy, a następnie uruchamiamy migrację dla nowo wygenerowanego schematu.

Nowy schemat ma być dokładną kopią tabel w innych schematach, z wyjątkiem oczywiście bez danych.

Podczas ostatniej przeprowadzonej migracji korzystałem z nieco starszej wersji szyn. Wciąż w 3, ale w starszym wieku. Kiedy tworzyło znaczniki czasu, były one NIEUŻYWALNE. Po uruchomieniu migracji na drugi dzień (na nowych szynach) ... Cóż, wszystkie pola są teraz NIE_NULL

Mam kod, który został opracowany z myślą, że updated_at został wypełniony tylko po aktualizacji rekordu ... nie kiedy został stworzony. (aplikacje zewnętrzne i "funkcje" bazy danych tworzą rekordy). Aplikacje innych firm i funkcje bazy danych, które tworzą rekordy, spadają na nowy schemat ... Poszedłem i usunięto wszystkie ograniczenia NOT_NULL na wszystkich tabele ręcznie, ale nie chcę, aby zapisywać porządki bezpośrednio w moim zadaniu migracji, więc wszystkie przyszłe tabele są poprawione.

Pomyślałem, że najlepszą rzeczą jest nadpisanie metody znaczników czasu, która była zmieniony, z powrotem na taki, który nie złamał istniejącego kodu.

Więc jest powód, dla którego muszę odwrócić/przesłonić ..
Moje pytanie brzmi teraz: W jaki sposób mogę przesłonić metodę. Nie widzę jasną ścieżkę klasy do niego i nie jestem do końca pewien, jak go zastąpić ..

Odpowiedz

4

Umieść to w łatce dla małpy ... Proste jak!

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::TableDefinition 
    def timestamps(*args) 
    options = args.extract_options! 
    column(:created_at, :datetime, options) 
    column(:updated_at, :datetime, options) 
    end 
end 

Jak powiedział Maniek. Aktualizacje dla szyn będą ignorowane z powodu tej "poprawki".

Ale jego pierwsza oferta robi to samo. Aby dopasować swoją poprawkę, musisz cofnąć się przez kolejne migracje i zastąpić "sygnaturami czasowymi" nowym kodem. Dodaj do tego, że będziesz musiał zastąpić całą przyszłą automatycznie generowaną migrację.

Nie sądzę, że pasuje do SUCHEGO ... Nie pasuje również do SPOT.

Po prostu B ostrożnie!

1

co w tym złego:

create_table :foo do |t| 
    t.text :bar 
    t.datetime :created_at 
    t.datetime :updated_at 
end 

?

+0

Mam już ponad 50 migracji, nie chcę ich przelać, zmieniając je wszystkie na ten paradygmat. Nie chcę też zmieniać kodu w szynach, aby utworzyć szkielet, aby wstawiał on uszkodzoną datę i czas zamiast znaczników czasu. – baash05

+3

@daveatflow zmieniając migracje na pewno zabrałoby ci mniej niż wpisanie pytania :) Gdzie przesłonić: Z pewnością można uruchamiać zadania rake z włączonym debugowaniem? umieść wywołanie 'debuggera' wewnątrz bloku create_table, przejdź do metody znacznika czasu, Powinieneś uzyskać lokalizację pliku. Osobiście nie polecam tego, ponieważ może się to również zmienić w przyszłych wersjach szyn. – maniek

+0

Jak już powiedziałem, mam ponad 50 migracji, musiałbym je wszystkie zmienić i wszystkie przyszłe migracje generowane przez szyny.Musiałbym również udokumentować, że inni musieli zmienić szyny migracji utworzone. Logika debuggera ... teraz jest inteligentna. Do zmiany w przyszłych wersjach. Próbuję tego uniknąć. Jeśli zmieniają nazwy pól (na przykład), to mam jedną bazę danych, dwa schematy, które powinny być identyczne, ale mają różne nazwy pól. – baash05