2009-04-15 13 views
11

He visto muchas conversaciones sobre las migraciones de ActiveRecord y si deben usarse o no para cambiar los datos dentro de su aplicación, algunas personas dicen que sí y dicen que no. Mi pregunta es si no estás usando Migraciones para hacer esto, ¿qué estás usando? ¿Solo otro guion que escribes?¿Cómo se modifican los datos de la aplicación Rails?

Estoy buscando sugerencias sobre formas alternativas y por qué podrían ser una mejor idea que simplemente usar migraciones.

Respuesta

14

Un problema viene si se utiliza el proporcionado

rake db:reset 

y

rake db:schema:load 

tareas, que utilizan schema.rb como base para la creación de su base de datos. Entonces no se cargan datos y estás atascado.

En Agile Web Development with Rails, Third Edition, que se debe bajar (? Si el libro Ruby es el libro "Pico", este debe ser el libro "hamaca", por cierto) si no lo ha hecho ya, DHH dice:

... las migraciones en realidad no están destinadas a llevar datos de inicialización. Son demasiado temporales en la naturaleza para hacer eso de manera confiable. Las migraciones están aquí para traerlo de una versión del esquema a la siguiente, para no crear un esquema nuevo desde cero-tenemos el archivo db/schema.rb para eso.

Así, tan pronto como realidad ponerse en marcha con una aplicación real, la gente no será la publicación de sus primeros migraciones cuando establecieron la aplicación . Comenzarán desde cualquiera que sea la versión almacenada en db/schema.rb e ignorarán todas las migraciones anteriores. Esto significa que los datos creados por las migraciones nunca llegan a la base de datos, por lo que no puede confiar en ellos.

Hay muchas maneras alternativas de obtener datos de semilla permanentes. El más fácil es , probablemente solo para crear un nuevo archivo en db/seed.rb, que contiene esas llamadas de creación de productos que harán la configuración . A continuación, este archivo se puede llamar después del rake db: schema: load crea el esquema inicial .

+1

En realidad, 'rake db: reset' también ejecuta' rake db: seed', por lo que cualquier dato en su archivo de semillas se carga junto con él. – lobati

4

muchas veces, las migraciones son la mejor opción y no se pueden reemplazar con un script separado. Imagine el siguiente escenario: la aplicación ya está en uso con datos en vivo; la columna del código contiene un código con el formato "zip-name-name" (sí, sé que es feo, pero sucede), y quieres dividirlo en dos columnas, "name" y "zip_code", mientras te deshaces del ' columna de código


def self.up 
    add_column :companies, :zip_code, :integer 
    add_column :companies, :name, :string 
    Company.reset_column_information 
    Company.find(:all).each do |company| 
    name, zip_code = company.code.split('-') 
    company.update_attributes(:name => name, :zip_code => zip_code) 
    end 
    remove_column :companies, :code 
end 

en este caso, la columna de código no se puede retirar antes de que los datos se transfieren a los nombres de columnas y código postal.

1

Cuando necesito modificar algunos datos en el databse, crearé una tarea de Rake que ejecuta alguna función de biblioteca para hacer el trabajo.De esta forma, la manipulación de datos será repetible y, si es necesario, también se puede ejecutar desde una migración.

Cuestiones relacionadas