web-development-kb-es.site

Cómo (y si) llenar la aplicación Rails con datos iniciales

Tengo una aplicación Rails donde los usuarios tienen que iniciar sesión. Por lo tanto, para que la aplicación sea utilizable, debe haber un usuario inicial en el sistema para que la primera persona inicie sesión (luego pueden crear usuarios posteriores). Hasta ahora he usado una migración para agregar un usuario especial a la base de datos.

Después de preguntar esta pregunta , parece que debería usar db: schema: load, en lugar de ejecutar las migraciones, para configurar nuevas bases de datos en nuevas máquinas de desarrollo. Desafortunadamente, esto no parece incluir las migraciones que insertan datos, solo aquellas que configuran tablas, claves, etc.

Mi pregunta es, ¿cuál es la mejor manera de manejar esta situación:

  1. ¿Hay alguna forma de obtener d: s: l para incluir migraciones de inserción de datos?
  2. ¿No debería utilizar migraciones para insertar datos de esta manera?
  3. ¿No debería estar rellenando previamente la base de datos con datos? ¿Debo actualizar el código de la aplicación para que maneje el caso en el que no hay usuarios correctamente y permita que se cree una cuenta de usuario inicial en vivo desde la aplicación?
  4. ¿Alguna otra opción? :)
61
Luke Halliwell

Pensé que resumiría algunas de las grandes respuestas que he tenido a esta pregunta, junto con mis propios pensamientos, ahora los he leído todos :)

Hay dos cuestiones distintas aquí:

  1. ¿Debo rellenar previamente la base de datos con mi usuario 'administrador' especial? ¿O debería la aplicación proporcionar una forma de configurar cuando se usa por primera vez?
  2. ¿Cómo se rellena previamente la base de datos con datos? Tenga en cuenta que esta es una pregunta válida independientemente de la respuesta a la parte 1: existen otros escenarios de uso para la precarga que un usuario administrador.

Para (1), parece que configurar el primer usuario desde la propia aplicación es un poco de trabajo adicional, para una funcionalidad que, por definición, casi nunca se usa. Sin embargo, puede ser un poco más seguro, ya que obliga al usuario a establecer una contraseña de su elección. La mejor solución es entre estos dos extremos: tener un script (o una tarea de rake, o lo que sea) para configurar el usuario inicial. La secuencia de comandos se puede configurar para que se rellene automáticamente con una contraseña predeterminada durante el desarrollo y para que se ingrese una contraseña durante la instalación/implementación de la producción (si desea evitar una contraseña predeterminada para el administrador).

Para (2), parece que hay una serie de soluciones buenas y válidas. Una tarea de comisión parece una buena manera, y hay algunos complementos para hacer esto aún más fácil. Solo mire algunas de las otras respuestas para ver los detalles de esas :)

4
Luke Halliwell

Intenta una tarea de rastrillo. Por ejemplo:

  1. Cree el archivo / lib/tasks/bootstrap.rake
  2. En el archivo, agregue una tarea para crear su usuario predeterminado:

    namespace :bootstrap do
      desc "Add the default user"
      task :default_user => :environment do
        User.create( :name => 'default', :password => 'password' )
      end

      desc "Create the default comment"
      task :default_comment => :environment do
        Comment.create( :title => 'Title', :body => 'First post!' )
      end

      desc "Run all bootstrapping tasks"
      task :all => [:default_user, :default_comment]
    end
  1. Luego, cuando está configurando su aplicación por primera vez, puede hacer rake db: migrate OR rake db: schema: load, y luego rake bootstrap: all.
46
Aaron Wheeler

Use db/seed.rb encontrado en cada aplicación de Rails.

Si bien algunas respuestas dadas anteriormente de 2008 pueden funcionar bien, están bastante desactualizadas y ya no son realmente la convención de Rails.

El llenado de los datos iniciales en la base de datos debe hacerse con el archivo db/seed.rb.

Simplemente funciona como un archivo de Ruby.

Para crear y guardar un objeto, puedes hacer algo como:

User.create(:username => "moot", :description => "king of /b/")

Una vez que tenga este archivo listo, puede hacer lo siguiente

rake db:migrate

rake db:seed

O en un paso

rake db:setup

Su base de datos debe rellenarse con los objetos que desea crear en seed.rb

34
Jason Kim

Recomiendo que no inserte ningún nuevo datos en las migraciones. En su lugar, solo modifique los datos existentes en las migraciones.

Para insertar datos iniciales, te recomiendo que uses YML. En cada proyecto de Rails que instalo, creo un directorio de dispositivos en el directorio DB. Luego creo archivos YML para los datos iniciales, al igual que los archivos YML se usan para los datos de prueba. Luego agrego una nueva tarea para cargar los datos de los archivos YML.

lib/tasks/db.rake:

namespace :db do
  desc "This loads the development data."
  task :seed => :environment do
    require 'active_record/fixtures'
    Dir.glob(Rails_ROOT + '/db/fixtures/*.yml').each do |file|
      base_name = File.basename(file, '.*')
      say "Loading #{base_name}..."
      Fixtures.create_fixtures('db/fixtures', base_name)
    end
  end

  desc "This drops the db, builds the db, and seeds the data."
  task :reseed => [:environment, 'db:reset', 'db:seed']
end

db/fixtures/users.yml:

test:
  customer_id: 1
  name: "Test Guy"
  email: "[email protected]"
  hashed_password: "656fc0b1c1d1681840816c68e1640f640c6ded12"
  salt: "188227600.754087929365988"
32
Jay Stramel

Esta es mi nueva solución favorita, usando el populador y las gemas falsas:

http://railscasts.com/episodes/126-populating-a-database

9
Mark Richman

Pruebe el seed-f plugin, que es un complemento bastante simple que le permite generar datos (y cambiarlos en el futuro), también le permitirá recopilar datos y datos específicos del entorno para todos los entornos. .

6
DEfusion

Supongo que la mejor opción es la número 3, principalmente porque de esa manera no habrá un usuario predeterminado, lo cual es una excelente manera de hacer que la buena seguridad sea inútil.

4
Vinko Vrsalovic

Considere usar la consola Rails. Ideal para tareas de administración únicas en las que no vale la pena configurar un script o migración.

En su máquina de producción:

script/console production

... entonces ...

User.create(:name => "Whoever", :password => "whichever")

Si está generando este usuario inicial más de una vez, también puede agregar un script en Rails_ROOT/script /, y ejecutarlo desde la línea de comandos en su máquina de producción, o mediante una tarea de capistrano.

3
Trevor Stow

Gran publicación del blog sobre esto: http://railspikes.com/2008/2/1/loading-seed-data

Estaba usando las sugerencias de Jay de un conjunto especial de accesorios, pero rápidamente me encontré creando datos que no serían posibles usando los modelos directamente (entradas no versionadas cuando estaba usando act_as_versioned)

3
Kevin Davis

Esa tarea de Rake puede ser proporcionada por el complemento db-populate:

http://github.com/joshknowles/db-populate/tree/master

3
pantulis

Para usuarios y grupos, la cuestión de los usuarios preexistentes debe definirse con respecto a las necesidades de la aplicación en lugar de las contingencias de la programación. Tal vez su aplicación requiere un administrador; entonces prepopular. O tal vez no, a continuación, agregue el código para solicitar la configuración de un usuario al momento de iniciar la aplicación.

En la pregunta más general, está claro que muchas aplicaciones de Rails pueden beneficiarse de una fecha previamente completada. Por ejemplo, una solicitud de retención de direcciones en los Estados Unidos también puede contener todos los estados y sus abreviaturas. Para estos casos, las migraciones son tu amigo, creo.

2
NickR

Lo mantendría en una migración. Si bien se recomienda usar el esquema para las configuraciones iniciales, la razón es que es más rápido, evitando así problemas. Una sola migración adicional para los datos debería estar bien.

También puede agregar los datos en el archivo de esquema, ya que es el mismo formato que las migraciones. Acabarías de perder la característica de generación automática.

2
MattW.

Algunas de las respuestas están desactualizadas. Desde Rails 2.3.4, hay una característica simple llamada Seed disponible en db/seed.rb:

#db/seed.rb
User.create( :name => 'default', :password => 'password' )
Comment.create( :title => 'Title', :body => 'First post!' )

Proporciona una nueva tarea de rake que puede usar después de las migraciones para cargar datos:

rake db:seed

Seed.rb es un archivo clásico de Ruby, siéntase libre de usar cualquier estructura de datos clásica (matriz, hashes, etc.) e iteradores para agregar sus datos:

["bryan", "bill", "tom"].each do |name|
  User.create(:name => name, :password => "password")
end

Si desea agregar datos con caracteres UTF-8 (muy comunes en francés, español, alemán, etc.), no se olvide de agregar al principio del archivo:

# Ruby encoding: utf-8

Este Railscast es una buena introducción: http://railscasts.com/episodes/179-seed-data

1
frenci