4Trabes Historias de una empresa en 100 metros cuadrados

El blog de Trabe Soluciones

ActiveRecord, la migration y reset_column_information

| | Comentarios

Este post tiene dos finalidades: apuntar un detalle de Rails para que nunca más se me olvide y quejarme(en vano) ya que, a veces, Rails tiene cosas que me resulta dificil entender como es el caso que nos ocupa. Veamos el siguiente fragmento de una inocente migration.

1
2
3
4
5
6
7
8
def self.up
  add_column 'users', 'energy', :integer, :null => false, :default => 0
  signup_energy = 20

  User.find(:all).each do |u|
    u.update_attribute('energy', signup_energy)
  end
end

Parece lógico pensar que la energía de los usuarios al finalizar la migration será 20. Craso error. La nergía es 0, el valor por defecto. La razón es que la clase User está inicializada antes de la ejecución de add_column y por tanto en el momento de actualizar el atributo con update_attribute no existe un campo energy. SI hubiesemos escrito algo como…

1
2
3
4
User.find(:all).each do |u|
  u.energy =  signup_energy
  u.save
end

…obtendríamos una simpatica excepción. No hay problema, miramos la documentación de Migration y nos encontramos con un apartado que habla de esto y nos indica que debemos invocar el método reset_column_information para poder actualizar los accessors de las diferentes propiedades de la clase.

1
2
User.reset_column_information
User.find(:all).each { |u|  u.update_attribute('energy', signup_energy) }

Todo esto está muy bien, pero a mi me asalta una duda. Si esto es así, por qué demonios no se invoca esa función cuando se modifica una columna de una tabla de forma transparente al programador.

En fin. Es lo que hay.

Lo sentimos, pero los comentarios están cerrados

Por qué no envías un ticket??

02/Apr/2007 Marze

Nunca vira a doc. de rails… está tremendo! oxalá houbera algo así para Zope, porque andar petando na e-porta ao autor dalgunha cousa e cansino cansino.

¿Por certo plantexastesvos dar algún curso de rails na afi ou na fic?

13/Apr/2007 Fic-eiro

Si el GPUL nos vuelve a invitar a alguna de sus jornadas estaremos encantados de dar alguna charla sobre RAILS. Sobre cursos más completos no hay nada de momento, pero si que estaríamos interesados. En este momento es necesario crear comunidad en torno a Rails, y un curso sería una manera perfecta de “enganchar a la gente”.

15/Apr/2007 David