To musi być coś prostego, ale doprowadza mnie to do szału!
Mam migracji gdzie chcę zaktualizować rekord potemSzyny nie pozwalają mi zmieniać rekordów podczas migracji
class SubjectsTextField < ActiveRecord::Migration
def self.up
add_column :users, :subjects, :text
User.find(39).update_attribute :subjects, "hey there"
end
def self.down
remove_column :users, :subjects
end
end
Kolumna zostanie utworzony, ale kiedy idę do rekordu 39 sprawdzić, to pole jest null przedmioty i nie powiedzieć „hej tam”. Podczas migracji nie są zgłaszane żadne błędy, a wiersz update_attribute zwraca wartość true, tak jakby działało.
Linia ta działa idealnie w konsoli i ma oczekiwany efekt:
User.find(39).update_attribute :subjects, "hey there"
Próbowałem oddanie linii update_attribute w drugim migracji. Jeśli przejdę przez oba z nich w jednym "rake db: migrate" aż do bieżącego, to nadal nie działa.
Ale tu jest ta dziwna część. Jeśli uruchomię dwie oddzielne migracje, powiedz "rake db: migrate VERSION = 10", aby utworzyć tylko kolumnę, a następnie drugą z "rake db: migrate", aby zaktualizować atrybut IT WORKS!
Co do cholery się dzieje ... w jaki sposób mogę zmodyfikować rekord podczas migracji? Wydaje mi się, że pamiętam, że robiłem to dość często w przeszłości. Może to coś innego z Rails 2.3.2?
Dzięki! Brian
to wszystko dzięki Michaelowi! Nie mogę uwierzyć, że nigdy nie wpadłem na to wcześniej ... dzięki milionowi. –
Miałem podobny problem. Ktoś nie użył t.timestamps podczas migracji, która utworzyła model, ale zrobili t.datetime: updated_at. Dlatego chciałem dodać: created_at i zainicjować istniejący obiekt 'created_at na aktualną wartość updated_at, ale zawsze było zero. Dziwne było to, że działało dobrze, gdy próbowałem używać Time.now. W każdym razie, dzięki Michael. Twój post bardzo pomógł! To naprawiło to dla mnie. – bratsche
Dziękuję Michaelowi za link do strony api: pomaga to być na bieżąco, ponieważ na innych stronach odkryłem, że #reset_column_information method jest przestarzałe. – Attilio