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