run remove rails migrations generate data column ruby-on-rails ruby-on-rails-3 rails-migrations

ruby-on-rails - remove - rollback migration rails



Cómo agregar nuevos datos de semilla a la base de datos de rieles existentes (6)

Estoy trabajando en una aplicación que ya está implementada en algunos sistemas de prueba y de ensayo y en varias estaciones de trabajo de desarrolladores. Necesito agregar algunos datos de referencia adicionales, pero no estoy seguro de cómo agregarlos.

La mayoría de los consejos dicen que use seed.rb, sin embargo, tengo entendido que esto solo se ejecuta una vez, cuando la aplicación se implementa inicialmente. Ya que no queremos reconstruir las bases de datos de prueba y de ensayo solo para poder agregar una fila de datos de referencia, ¿hay otra forma de agregar los datos?

Estoy pensando en utilizar una migración de db, ¿es este el enfoque correcto?

Gracias


En lugar de alterar seeds.db , que probablemente desee utilizar para sembrar nuevas bases de datos, puede crear una tarea de Rake personalizada ( RailsCast # 66 Custom Rake Tasks ).

Puedes crear tantas tareas de Rake como quieras. Por ejemplo, digamos que tiene dos servidores, uno que ejecuta la versión 1.0 de su aplicación, el otro que ejecuta 1.1, y desea actualizar ambos a 1.2. Luego, puede crear lib/tasks/1-0-to-1-2.rake y lib/tasks`1-1-to-1-2.rake ya que puede necesitar un código diferente dependiendo de la versión de su aplicación.


Es mejor usar un método idempotente como este en seed.rb u otra tarea llamada por seed.rb:

Contact.find_by_email("[email protected]") || Contact.create(email: "[email protected]", phone: "202-291-1970", created_by: "System") # This saves you an update to the DB if the record already exists.

O similar a @ nmott''s:

Contact.find_or_initialize_by_email("[email protected]").update_attributes(phone: "202-291-1970", created_by: "System") # this performs an update regardless, but it may be useful if you want to reset your data.

o use assign_attributes lugar de update_attributes si desea asignar múltiples atributos antes de guardar.


Estructure su archivo seed.rb para permitir la creación y actualización continua de datos. No está limitado a ejecutar un archivo semilla solo una vez y, si cree que solo se utiliza para la implementación inicial, perderá la flexibilidad que puede ofrecer al configurar los datos de referencia.

Un archivo semilla es solo ruby ​​para que puedas hacer cosas como:

user = User.find_or_initialize_by(email: ''[email protected]'') user.name = ''Bob'' user.password = ''secret'' user.role = ''manager'' user.save!

Esto creará nuevos datos si no existen o actualizará los datos si encuentra alguno.

Si estructura su archivo semilla correctamente, también puede crear y actualizar objetos dependientes.

Recomiendo usar bang save para garantizar que se generen excepciones en el caso de que no se pueda guardar un objeto. Este es el método más fácil de depurar la semilla.

Utilizo la gema del banco de semillas para proporcionar más estructura a mis datos de semillas, incluida la configuración de datos por entorno, semillas dependientes y más.

No recomiendo usar migraciones para datos semilla. Existe una falta de flexibilidad (cómo se dirigen los datos semilla a un solo entorno, por ejemplo) y no hay una forma real de crear un conjunto de datos reutilizables que se puedan ejecutar en cualquier momento para actualizar un entorno en particular. También tendría un conjunto de migraciones que no tienen ninguna referencia a su esquema y tendría que crear nuevas migraciones cada vez que quisiera generar datos nuevos o diferentes.


Hice algo como esto en seed.rb

users_list = [ {id: 1, name: "Diego", age: "25"}, {id: 2, name: "Elano", age: "27"} ] while !users_list.empty? do begin User.create(users_list) rescue users_list = users_list.drop(1) #removing the first if the id already exist. end end

Si ya existe un elemento en la lista con el ID dado, devolverá una excepción, luego eliminamos ese elemento y lo intentamos nuevamente, hasta que la matriz users_list esté vacía.

De esta manera, no necesita buscar cada objeto antes de incluirlo, pero no podrá actualizar los valores ya insertados como en el código @nmott.


Puedes usar una migración, pero esa no es la opción más segura que tienes. Digamos, por ejemplo, que agrega un registro a una tabla a través de una migración, luego en el futuro cambia el esquema de esa tabla. Cuando instales la aplicación en algún lugar, no podrás ejecutar rake db:migrate .

Las semillas siempre son recomendables porque rake db:seed se puede ejecutar en un esquema completamente migrado.

Si es solo para un registro, ve por la consola de rieles.


Uso el archivo semilla para agregar instancias a tablas nuevas o existentes todo el tiempo. Mi solución es simple. Solo comento todos los demás datos de semilla en el archivo db / seeds.rb para que solo los nuevos datos de semilla sean de código en vivo. A continuación, ejecute bin/rake db:seed .