2009-06-09 10 views
16

Esto debe ser algo simple pero me está volviendo loco!
tengo una migración donde quiero actualizar un registro despuésRails no me permitirá cambiar los registros durante la migración

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 

La columna se crea pero cuando voy a comprobar ficha 39, es campo de los sujetos es nula y no dice "Hola". No se generan errores durante la migración y la línea update_attribute devuelve verdadero como si hubiera funcionado.

Esta línea funciona perfectamente en la consola y tiene el efecto esperado:

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

He intentado poner la línea update_attribute en una segunda migración. Si soplo a través de ambos en un "rake db: migrate" hasta llegar a la actual, todavía no funciona.

Pero aquí está la parte extraña. Si ejecuto dos migraciones por separado, diga "rake db: migrate VERSION = 10" para crear solo la columna y luego la segunda con "rake db: migrate" para actualizar el atributo IT WORKS.

¿Qué diablos está pasando ... cómo modificar un registro durante una migración? Me parece recordar haber hecho esto con bastante frecuencia en el pasado. Tal vez es algo diferente con Rails 2.3.2?

Gracias! Brian

Respuesta

33

Es necesario llamar reset_column_information del modelo que haya cambiado antes de poder utilizar la nueva columna. Añadir esta entre la actualización y add_column:

User.reset_column_information 

Consulte "Uso de un modelo después de cambiar su tabla" en la página ActiveRecord::Migration.

+0

eso fue gracias Michael! No puedo creer que nunca me haya encontrado con esto antes ... gracias un millón. –

+0

Tuve un problema similar. Alguien no usó t.timestamps en una migración que creó un modelo, pero lo hicieron t.datetime: updated_at. Así que quería agregar: created_at e inicializar cualquier objeto existente 'created_at al valor actual de updated_at, pero siempre era nil. Lo extraño fue que funcionó bien cuando traté de usar Time.now. De todos modos, gracias Michael. ¡Tu publicación ayudó mucho! Eso lo solucionó para mí. – bratsche

+0

Gracias a Michael por el enlace a la página de la API: ayuda a mantenerme actualizado porque en otras páginas he descubierto que el método #reset_column_information está en desuso. – Attilio

0

Si combina los dos en su migración inicial de esta manera, ¿funciona?

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

No, no funciona de esta manera con las comillas, gracias por la respuesta! –

1

Esta sintaxis es mucho más claro ... tratar con 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 
Cuestiones relacionadas