ruby on rails - remove - Cómo(y si) llenar la aplicación de rieles con datos iniciales
rollback migration rails (13)
Tengo una aplicación de rieles 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 hacer 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?
- ¿Hay alguna manera de obtener d: s: l para incluir migraciones de inserción de datos?
- ¿No debería usar migraciones para insertar datos de esta manera?
- ¿No debería rellenar previamente la base de datos con datos? ¿Debo actualizar el código de la aplicación para que maneje el caso donde no hay usuarios con elegancia, y permite que se cree una cuenta de usuario inicial en vivo desde la aplicación?
- ¿Alguna otra opción? :)
Considere usar la consola de rieles. Bueno para tareas de administración puntuales en las que no vale la pena el esfuerzo de configurar un script o una 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 comando en su máquina de producción, o mediante una tarea capistrano.
La tarea Rake puede ser proporcionada por el plugin db-populate:
Lo mantendría en una migración. Si bien se recomienda utilizar el esquema para las configuraciones iniciales, la razón es que es más rápido, lo que evita problemas. Una sola migración extra para los datos debería estar bien.
También puede agregar los datos en el archivo de esquema, ya que tiene el mismo formato que las migraciones. Perderías la característica de autogeneración.
Para los 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 requiera un administrador; luego prepoblar. O tal vez no, luego agregue el código para solicitar elegantemente una configuración de usuario en el momento del lanzamiento de la aplicación.
En la pregunta más general, está claro que muchas aplicaciones de Rails pueden beneficiarse de una fecha pre-poblada. Por ejemplo, una solicitud de retención de dirección de EE. UU. También puede contener todos los Estados y sus abreviaturas. Para estos casos, las migraciones son su amigo, creo.
Supongo que la mejor opción es la número 3, principalmente porque de esa manera no habrá un usuario predeterminado, que es una gran manera de inutilizar la seguridad, que de otro modo sería buena.
Esta es mi nueva solución favorita, usando populator y faker gems:
Pensé en resumir algunas de las excelentes respuestas que he tenido a esta pregunta, junto con mis propios pensamientos ahora que los he leído todos :)
Hay dos problemas distintos aquí:
- ¿Debo rellenar la base de datos con mi usuario especial ''admin''? ¿O debería la aplicación proporcionar una forma de configurarla cuando se usa por primera vez?
- ¿Cómo se puede completar 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: hay otros escenarios de uso para la población previa que un usuario administrador.
Para (1), parece que configurar el primer usuario desde dentro de la aplicación es bastante trabajo adicional, para la funcionalidad que, por definición, casi nunca se utiliza. 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. El script se puede configurar para que se complete automáticamente con una contraseña predeterminada durante el desarrollo, y para solicitar que se ingrese una contraseña durante la instalación / implementación de producción (si desea desalentar una contraseña predeterminada para el administrador).
Para (2), parece que hay una serie de buenas soluciones válidas. Una tarea de rake parece una buena manera, y hay algunos complementos para hacer esto aún más fácil. Solo mira a través de algunas de las otras respuestas para ver los detalles de esos :)
Prueba una tarea de rake. Por ejemplo:
- Crea el archivo /lib/tasks/bootstrap.rake
- 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
- Luego, cuando está configurando su aplicación por primera vez, puede hacer rake db: migrar O rake db: schema: load, y luego rake bootstrap: all.
Pruebe el plugin seed-fu , que es un plugin bastante simple que le permite sembrar datos (y cambiar esos datos semilla en el futuro), también le permitirá generar datos y datos específicos del entorno para todos los entornos.
Recomiendo que no inserte ningún dato nuevo en las migraciones. En su lugar, solo modifique datos existentes en migraciones.
Para insertar datos iniciales, te recomiendo que uses YML. En cada proyecto de Rails que configuro, creo un directorio de dispositivos en el directorio de DB. Luego creo archivos YML para los datos iniciales al igual que los archivos YML se utilizan 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"
Gran publicación de 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 acts_as_versioned)
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 sus migraciones para cargar datos:
rake db:seed
Seed.rb es un archivo Ruby clásico, puede usar cualquier estructura de datos clásica (matriz, hash, 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 olvide agregar al principio del archivo:
# ruby encoding: utf-8
Este Railscast es una buena introducción: http://railscasts.com/episodes/179-seed-data
Use db/seed.rb
en todas las aplicaciones de Rails.
Si bien algunas respuestas dadas anteriormente desde 2008 pueden funcionar bien, son bastante obsoletas y ya no son realmente convenciones de Rails.
La población de datos iniciales en la base de datos se debe hacer con el archivo db/seed.rb
Simplemente funciona como un archivo 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 solo paso
rake db:setup
Su base de datos debe estar poblada con los objetos que desea crear en seed.rb