Rails не позволит мне изменять записи во время миграции
Это должно быть что-то простое, но это сводит меня с ума!
У меня есть миграция, где я хочу обновить запись позже
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
Столбец создается, но когда я перехожу к контрольной записи 39, он ставит поле null и не говорит "эй там". Во время миграции ошибок не возникает, и строка update_attribute возвращает true, как если бы она работала.
Эта строка отлично работает в консоли и имеет ожидаемый эффект:
User.find(39).update_attribute :subjects, "hey there"
Я попытался поместить строку update_attribute во вторую миграцию. Если я прогоню их обоих в одном "рейке db: migrate" до текущего, он все равно не работает.
Но вот странная часть. Если я запускаю две отдельные миграции, скажите "rake db: migrate VERSION = 10", чтобы создать только столбец, а затем второй с "rake db: migrate", чтобы обновить атрибут IT WORKS!
Что происходит... как мне изменить запись во время миграции? Кажется, я помню это довольно часто в прошлом. Может быть, это что-то другое с Rails 2.3.2?
Спасибо!
Brian
Ответы
Ответ 1
Вам нужно вызвать reset_column_information
в модели, которую вы изменили, прежде чем сможете использовать новый столбец. Добавьте это между add_column
и обновлением:
User.reset_column_information
См. "Использование модели после изменения ее таблицы" на странице ActiveRecord:: Migration.
Ответ 2
Этот синтаксис очень ясен... попробуйте с помощью 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
Ответ 3
Если вы объедините эти два в своей начальной миграции, как это, работает ли это?
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