2009-06-09 7 views
16

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

Odpowiedz

33

Trzeba zadzwonić reset_column_information modelu została zmieniona, zanim będzie można korzystać z nowej kolumny. Dodaj to między aktualizacją add_column oraz:

User.reset_column_information 

Patrz „Korzystanie z modelu po zmianie jego tabeli” na stronie ActiveRecord::Migration.

+0

to wszystko dzięki Michaelowi! Nie mogę uwierzyć, że nigdy nie wpadłem na to wcześniej ... dzięki milionowi. –

+0

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

+0

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

0

Jeśli połączysz te dwie osoby podczas początkowej migracji, czy to działa?

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 
+0

Nie działa tak w cytatach, dziękuję za odpowiedź! –

1

Składnia ta jest dużo jasne ... spróbuj change_table

class AddReceiveNewsletterToUsers < ActiveRecord::Migration 
    def self.up 
    change_table :users do |t| 
     add_column :users, :subjects, :text 
    end 
    User.find(39).update_attribute "subjects", "hey there" 
    end 

    def self.down 
    remove_column :users, :receive_newsletter 
    end 
end 
Powiązane problemy