/ / Railsy nie pozwalają mi zmieniać rekordów podczas migracji - ruby-on-rails, migracja

Railsy nie pozwalają mi zmieniać rekordów podczas migracji - ruby-on-rails, migracja

To musi być coś prostego, ale doprowadza mnie to do szału!
Mam migrację, w której chcę później zaktualizować płytę

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 utworzona, ale kiedy przejdę do sprawdzeniarekord 39, pole tematu jest puste i nie mówi "hej tam". Podczas migracji nie są zgłaszane żadne błędy, a wiersz update_attribute zwraca wartość true, tak jakby działało.

Ta linia działa idealnie w konsoli i ma oczekiwany efekt:

User.find(39).update_attribute :subjects, "hey there"

Próbowałem umieścić linię update_attribute podczas drugiej migracji. Jeśli przejdę przez oba z nich w jednym "rake db: migrate" aż do bieżącego, to nadal nie działa.

Ale tutaj 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

Odpowiedzi:

33 dla odpowiedzi № 1

Musisz zadzwonić reset_column_information na modelu, który zmieniłeś, zanim będziesz mógł użyć nowej kolumny. Dodaj to między add_column i zaktualizuj:

User.reset_column_information

Zobacz "Korzystanie z modelu po zmianie jego tabeli" na stronie ActiveRecord :: Migration strona.


1 dla odpowiedzi nr 2

Ta składnia jest bardzo jasna ... spróbuj z 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

0 dla odpowiedzi № 3

Jeśli połączysz te dwie w 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