2011-08-08 15 views
13

¿Cómo uso un archivo YAML en vez de seeds.rb para cargar los datos iniciales en una base de datos?Ruby on Rails: carga de datos de inicialización de un archivo YAML

+0

En vista de que la respuesta aceptada no es muy grande (pone los datos de semillas en 'test /' directorio), y [mi respuesta] (http://stackoverflow.com/a/24957205/405550) tiene significativamente más upvotes, ¿podrías considerar aceptar el mío? – Zaz

Respuesta

3

Mira la Ruby on Rails Guía de accesorios:

http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures

En general, puede crear archivos de datos YAML en el directorio test/ y luego cargarlos en la base de datos utilizando el comando rake db:fixtures:load. La documentación completa sobre todas las cosas interesantes que puedes hacer con los accesorios está aquí:

http://api.rubyonrails.org/classes/Fixtures.html

+3

¿Funcionará lo mismo para el desarrollo o la producción? – fijiaaron

+1

El último enlace está roto. Además, cargar datos de semilla de 'prueba /' no parece ser la forma correcta de hacer las cosas. – Zaz

+0

Me hace sentir incómodo también, pero en la práctica algunas personas usan dispositivos para completar datos con fines de prueba. Tener el mismo yaml siembra archivos en dos lugares se siente aún más ... asqueroso. – jaydel

19

Añadir un código en db/seeds.rb para analizar el archivo YAML, por ejemplo:

seed_file = Rails.root.join('db', 'seeds', 'categories.yml') 
config = YAML::load_file(seed_file) 
Category.create!(config) 

Luego, basta con colocar el YAML fie en db/seeds/categories.yml. El archivo YAML debe ser una lista de matrices asociativas, ej .:

- name: accessory 
    shortcode: A 

- name: laptop 
    shortcode: L 

- name: server 
    shortcode: S 
+0

El problema con esta solución es que si ejecuta 'rake db: seed' un segundo tiempo, obtendrás un montón de duplicados. Dependiendo de los requisitos de singularidad, es probable que desee modificar la última línea para que sea algo como: 'config.each {| values ​​| Category.first_or_create (values)} ' – sberkley

+0

¿En qué situación le gustaría sembrar la base de datos dos veces? 'rake db: reset' hace todo lo que necesita el 99% del tiempo. – Zaz

+2

Si agrega nuevos valores sembrados a la tabla o agrega una nueva tabla con valores sembrados. Dejar caer toda la base de datos puede ser una solución en un entorno de desarrollo, pero ciertamente no está en producción. Dejar caer la tabla sembrada antes de volver a sembrar tampoco es una opción si hay referencias a los identificadores de esa tabla en otra tabla. Si necesita eliminar valores previamente sembrados, la situación se complica aún más y puede requerir una solución más allá de 'rake db: seed'. – sberkley

2

utilicé la respuesta @Zaz respondió. Funciona muy bien.

Pero mientras tanto, si algo salió mal con sus datos de inicialización (Por ejemplo, tiene un archivo yaml de semilla muy grande), le gustaría saber qué parte de su yaml salió mal. ¡En ese momento puedes agregar un bloque después de crear! para la depuración de esta manera:

seed_file = Rails.root.join('db', 'seeds', 'categories.yml') 
config = YAML::load_file(seed_file) 
counter = 0 
Category.create!(config) do |c| 
    puts "Create category #{counter += 1} with name: #{c.name}" 
end