2009-04-17 24 views
68

Tengo una tarea de rastreo que rellena algunos datos iniciales en mi aplicación de rieles. Por ejemplo, países, estados, operadores de telefonía móvil, etc.¿Cuál es la mejor forma de crear una base de datos en Rails?

La forma en que la configuro ahora, es que tengo un montón de declaraciones de creación en archivos en/db/fixtures y una tarea de rake que las procesa. Por ejemplo, un modelo que tengo es temas. Tengo un archivo en theme.rb/db/accesorios que tiene este aspecto:

Theme.delete_all 
Theme.create(:id => 1, :name=>'Lite', :background_color=>'0xC7FFD5', :title_text_color=>'0x222222', 
         :component_theme_color=>'0x001277', :carrier_select_color=>'0x7683FF', :label_text_color=>'0x000000', 
         :join_upper_gradient=>'0x6FAEFF', :join_lower_gradient=>'0x000000', :join_text_color=>'0xFFFFFF', 
         :cancel_link_color=>'0x001277', :border_color=>'0x888888', :carrier_text_color=>'0x000000', :public => true) 

Theme.create(:id => 2, :name=>'Metallic', :background_color=>'0x000000', :title_text_color=>'0x7299FF', 
         :component_theme_color=>'0xDBF2FF', :carrier_select_color=>'0x000000', :label_text_color=>'0xDBF2FF', 
         :join_upper_gradient=>'0x2B25FF', :join_lower_gradient=>'0xBEFFAC', :join_text_color=>'0x000000', 
         :cancel_link_color=>'0xFF7C12', :border_color=>'0x000000', :carrier_text_color=>'0x000000', :public => true) 

Theme.create(:id => 3, :name=>'Blues', :background_color=>'0x0060EC', :title_text_color=>'0x000374', 
         :component_theme_color=>'0x000374', :carrier_select_color=>'0x4357FF', :label_text_color=>'0x000000', 
         :join_upper_gradient=>'0x4357FF', :join_lower_gradient=>'0xffffff', :join_text_color=>'0x000000', 
         :cancel_link_color=>'0xffffff', :border_color=>'0x666666', :carrier_text_color=>'0x000000', :public => true) 
puts "Success: Theme data loaded" 

La idea aquí es que quiero instalar algunos temas de valores para que los usuarios comienzan con. Tengo un problema con este método

Establecer la ID no funciona. Esto significa que si decido agregar un tema, llamémoslo 'Rojo', entonces simplemente me gustaría agregar la declaración del tema a este archivo de dispositivo y llamar a la tarea de rake para resembrar la base de datos. Si lo hago, debido a que los temas pertenecen a otros objetos y su identificación cambia con esta reinicialización, todos los enlaces se rompen.

Mi pregunta es, en primer lugar, ¿es esta una buena manera de gestionar la creación de una base de datos? En una publicación anterior, esto me fue recomendado.

Si es así, ¿cómo puedo codificar los ID, y hay algún inconveniente para eso?

Si no, ¿cuál es la mejor manera de sembrar la base de datos?

Realmente apreciaré las respuestas largas y pensadas que incorporan las mejores prácticas.

+0

¿Podría aceptar la respuesta más actualizada? –

+0

Acabo de hacer. Gracias por el recordatorio – Tony

Respuesta

99

Actualizando debido a que estas respuestas están desactualizadas (aunque algunas siguen siendo válidas).

Característica simple agregada en los carriles 2.3.4, db/seeds.rb

Proporciona una nueva tarea rastrillo

rake db:seed 

Bueno para poblar registros estáticos comunes como estados, países, etc ...

http://railscasts.com/episodes/179-seed-data

* Tenga en cuenta que puede utilizar los accesorios si ya los había creado para poblar también con la tarea db: seed poniendo lo siguiente en su archivo seeds.rb (del episodio de railscast):

require 'active_record/fixtures' 
Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "operating_systems") 

para los carriles 3.x uso 'ActiveRecord :: Accesorios' en lugar de 'Accesorios' constante

require 'active_record/fixtures' 
ActiveRecord::Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "fixtures_file_name") 
2

En lugar de usar creaciones explícitas, use archivos YAML. Con una sintaxis simple, puede completar todos los valores de un objeto. En realidad, si conoce algo sobre las pruebas de rieles, esa es la forma estándar de inicializar la base de datos de prueba. Salida estas páginas:
http://railspikes.com/2008/2/1/loading-seed-data http://quotedprintable.com/2007/11/16/seed-data-in-rails

+5

que sé sobre las pruebas de rieles. No estoy probando mi aplicación, estoy sembrando mi base de datos para desarrollo y producción. además, el artículo que me enviaste concluye apoyando mi método de sembrar la base de datos. – Tony

-4

La mejor manera es usar accesorios.

Nota: Tenga en cuenta que los accesorios hacen insertos directos y no usan su modelo, por lo que si tiene devoluciones de llamada que llenan datos, necesitará encontrar una solución alternativa.

0

Agréguelo en las migraciones de bases de datos, de esa forma todos lo obtienen a medida que se actualizan. Maneje toda su lógica en el código ruby ​​/ rails, para que nunca tenga que meterse con la configuración explícita de ID.

+0

si necesito cambiar los datos iniciales, las cosas pueden volverse complicadas al usar migraciones. su segundo comentario realmente no tiene sentido. los enlaces a través de claves externas se destruirán – Tony

+0

c = Category.create (cosas) p = Post.create (cosas) p.category = c No es necesario configurar explícitamente los ID. Si cambia los datos iniciales, solo crea una nueva migración. Muy fácil. –

+0

que supone que las asociaciones se pueden realizar en el momento en que se crea el objeto. aquí hay un ejemplo en el que creo que su lógica falla ... corríjanme si estoy equivocado. siembro el DB con temas de plantilla. ID de usuario = 1 crea una ID de plantilla = 2 y con id de tema = 4. en este punto, un registro está en el db de la siguiente manera: template: id = 2, user_id = 1, theme_id = 4. ahora si reinicio el db, el id del tema = 4 ahora es id del tema = 10 ... y luego la plantilla del usuario tiene el tema incorrectamente – Tony

25

factory_girl parece que hará lo que está tratando de lograr. Puede definir todos los atributos comunes en la definición predeterminada y luego anularlos en el momento de la creación. También se puede pasar un id a la fábrica:

Factory.define :theme do |t| 
    t.background_color '0x000000' 
    t.title_text_color '0x000000', 
    t.component_theme_color '0x000000' 
    t.carrier_select_color '0x000000' 
    t.label_text_color '0x000000', 
    t.join_upper_gradient '0x000000' 
    t.join_lower_gradient '0x000000' 
    t.join_text_color '0x000000', 
    t.cancel_link_color '0x000000' 
    t.border_color '0x000000' 
    t.carrier_text_color '0x000000' 
    t.public true 
end 

Factory(:theme, :id => 1, :name => "Lite", :background_color => '0xC7FFD5') 
Factory(:theme, :id => 2, :name => "Metallic", :background_color => '0xC7FFD5') 
Factory(:theme, :id => 3, :name => "Blues", :background_color => '0x0060EC') 

Cuando se utiliza con falsificador se puede llenar una base de datos muy rápido con las asociaciones sin tener que enredar con accesorios (puaj).

Tengo un código como este en una tarea de rake.

100.times do 
    Factory(:company, :address => Factory(:address), :employees => [Factory(:employee)]) 
end 
+10

FactoryGirl está hecho para pruebas en lugar de accesorios, pero también se puede usar para cargar cosas en producción. Utilice una tarea de rake que tenga db: migrar como requisito previo para cargar todos los datos predeterminados. Es posible que necesite hacer que la tarea de rake sea lo suficientemente inteligente como para que no ocurra. crear copias de los datos existentes. –

+0

No se recomienda el uso de FactoryGirl for seed, [consulte esta publicación] (https://robots.thoughtbot.com/factory_girl-for-seed-data). – blackbiron

24

Por lo general, hay 2 tipos de datos de semillas requeridas.

  • Datos básicos sobre la cual el núcleo de su aplicación puede confiar. Yo llamo a esto las semillas comunes.
  • Datos medioambientales, por ejemplo para desarrollar la aplicación, es útil tener un montón de datos en un estado conocido que podamos usar para trabajar en la aplicación localmente (la respuesta de Factory Girl anterior cubre este tipo de datos).

En mi experiencia, siempre me encontré con la necesidad de estos dos tipos de datos. Así que armé a small gem that extends Rails' seeds y le permití agregar varios archivos semilla comunes bajo db/seeds/y cualquier dato de semilla ambiental bajo db/seeds/ENV por ejemplo db/seeds/development.

He encontrado este enfoque es suficiente para dar mis datos de semillas cierta estructura y me da el poder para configurar mi entorno de desarrollo o puesta en escena en un estado conocido sólo con la ejecución:

rake db:setup 

Los accesorios son frágiles y raro para mantener, como son los vertederos sql regulares.

21

El uso del archivo seeds.rb o FactoryGirl es excelente, pero son excelentes para las pruebas y las estructuras de datos fijas.

La gema seedbank puede darle más control y modularidad a sus semillas. Inserta tareas de rake y también puede definir dependencias entre sus semillas. Su lista de tareas rastrillo tendrá estas adiciones (por ejemplo):

rake db:seed     # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/ENVIRONMENT/*.seeds.rb. ENVIRONMENT is the current environment in Rails.env. 
rake db:seed:bar    # Load the seed data from db/seeds/bar.seeds.rb 
rake db:seed:common    # Load the seed data from db/seeds.rb and db/seeds/*.seeds.rb. 
rake db:seed:development  # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/development/*.seeds.rb. 
rake db:seed:development:users # Load the seed data from db/seeds/development/users.seeds.rb 
rake db:seed:foo    # Load the seed data from db/seeds/foo.seeds.rb 
rake db:seed:original   # Load the seed data from db/seeds.rb 
0

Carriles ha construido en forma de semilla de datos como se explica here.

Otra forma sería usar una gema para una siembra más avanzada o fácil, como por ejemplo: seedbank.

La principal ventaja de esta joya y la razón por la que la uso es que tiene capacidades avanzadas, como las dependencias de carga de datos y los datos de semilla del entorno.

Agregando una respuesta actualizada ya que esta fue la primera respuesta en google.

Cuestiones relacionadas