rails programar ejemplos ruby-on-rails ruby database task seed

ruby on rails - programar - ¿Cuál es la mejor forma de crear una base de datos en Rails?



programar en ruby on rails (8)

Tengo una tarea de rake que rellena algunos datos iniciales en mi aplicación Rails. Por ejemplo, países, estados, operadores de telefonía móvil, etc.

La forma en que lo tengo configurado ahora, es que tengo un montón de declaraciones de creación en archivos en / db / fixtures y una tarea de rake que los procesa. Por ejemplo, un modelo que tengo es temas. Tengo un archivo theme.rb en / db / fixtures que se ve así:

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 stock para que comiencen los usuarios. 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.


Añádalo a las migraciones de la base 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.


Actualizando ya que estas respuestas están un poco desactualizadas (aunque algunas todavía se aplican).

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

Proporciona una nueva tarea de rake

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 usar fixtures si ya los ha creado para completarlos 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 Rails 3.x use ''ActiveRecord :: Fixtures'' en lugar de la constante ''Fixtures''

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



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 completan datos, necesitará encontrar una solución alternativa.


Por lo general, se requieren 2 tipos de datos de semilla.

  • Datos básicos sobre los cuales puede confiar el núcleo de su aplicación. 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é una pequeña gema que extiende las semillas de Rails y le permite agregar múltiples archivos de semillas comunes bajo db / seeds / y cualquier dato de semilla ambiental bajo db / seeds / ENV por ejemplo db / seeds / development.

He descubierto que este enfoque es suficiente para dar cierta estructura a mis datos de inicialización y me da la capacidad de configurar mi entorno de desarrollo o estadificación en un estado conocido con solo ejecutar:

rake db:setup

Los artefactos son frágiles y flakey para mantener, al igual que los vertederos sql regulares.


Rails tiene una forma integrada de generar datos como se explica http://railscasts.com/episodes/179-seed-data .

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.

Agregar una respuesta actualizada ya que esta respuesta fue primero en google.


Usar el archivo seeds.rb o FactoryBot es genial, pero son excelentes para las pruebas y las estructuras de datos fijos.

La gema del seedbank podría 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 de rake 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


factory_bot parece que hará lo que intentas lograr. Puede definir todos los atributos comunes en la definición predeterminada y luego anularlos en el momento de la creación. También puede pasar una identificación 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 usa con faker, puede poblar una base de datos muy rápidamente con asociaciones sin tener que meterse con Fixtures (yuck).

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

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