Migraciones de datos antiguos

Hola, estoy intentando preparar una migración de los datos antiguos a la
nueva aplicación, pero tengo un problema: no consigo que RoR acepte los
datos del campo ID, se empeña en asignar el ID de forma automática. Por
ejemplo:

class AddDataUsuarios < ActiveRecord::Migration
def self.up
Usuario.create(:id => ‘15’,
:nick => “admin”,
:password => “admin”,
:email => “[email protected]”,
:nombre => “Paco”,
:apellidos => “Pico”,
:cod_postal => “46021”,
:provincia => “Valencia”)
end

def self.down
Usuario.delete_all
end
end

Y al hacer el Rake db:migrate, coge el usuario bien… pero con ID = 1.
¿Sabéis algún remedio para esto? Porque si no, voy a tener que meter los
datos por SQL, que es el otro remedio…

s2

On 10/2/07, Fernando C. [email protected]
wrote:

               :email => "[email protected]",

[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

Creo que Rails no permite la asignación del id en create o new, pero
sí puedes asignarlo “manualmente”: usuario.id = 15, y luego salvar el
registro. No lo he comprobado, pero creo que esto es
así.
Suerte.

Creo que Rails no permite la asignaci�n del id en create o new, pero
sí puedes asignarlo “manualmente”: usuario.id = 15, y luego salvar el
registro. No lo he comprobado, pero creo que esto es
así.

Efectivamente, no he podido asignar el id… la solución ha sido
prescindir del sistema de migraciones, y volcar los datos en un archivo
YAML desde el que he importado; ahí no hay problema con asignar los IDs
a mano.

Por cierto, como curiosidad: En las migraciones, si hay algún registro
que no pasa las validaciones, se migran sólo los que están bien; con el
YAML, si alguno da problemas, no entra ni un sólo registro… lo que
está bien, porque ayuda a detectar los problemas y que no pasen
inadvertidos.

s2 y gracias!!

Para la proxima vez, puedes usar este truco:

class AddDataUsuarios < ActiveRecord::Migration
def self.up
User.send(:define_method, :attributes_protected_by_default) {|| []}

 Usuario.create(:id => '15',
                :nick => "admin",
                :password => "admin",
                :email => "[email protected]",
                :nombre => "Paco",
                :apellidos => "Pico",
                :cod_postal => "46021",
                :provincia => "Valencia")

end

def self.down
Usuario.delete_all
end
end

La linea
User.send( :define_method, :attributes_protected_by_default) {||
[]}
redefine el metodo “attributes_protected_by_default” para que no
incluya “id” y asi puedas asignarlo en el create.

Esa linea debe de estar dentro de self.up, para asegurarte de que
solo sea invocada cuando hagas la migracion y no en otros momentos en
que tu codigo sea procesado, pues eso podria ser un problema de
seguridad bastante serio.

Muchas gracias, Sebastian, funciona muy bien, pues permite dejar el ID
en blanco (y entonces lo asigna automáticamente) o fijarlo “a mano” (y
entonces lo respeta). Una solución muy buena.