Comment (et si) remplir l'application avec les données initiales
j'ai une application rail où les utilisateurs doivent se connecter. Par conséquent, pour que l'application soit utilisable, il doit y avoir un utilisateur initial dans le système pour que la première personne se connecte avec (ils peuvent alors créer des utilisateurs ultérieurs). Jusqu'à maintenant j'ai utilisé une migration ajouter un utilisateur à la base de données.
après avoir posé cette question , il semble que je devrais utiliser db:schema:load, plutôt que d'exécuter les migrations, pour configurer nouvelles bases de données sur les nouvelles machines de développement. Malheureusement, cela ne semble pas inclure les migrations qui insèrent des données, seulement celles qui mettent en place des tables, des clés, etc.
ma question Est, Quelle est la meilleure façon de gérer cette situation:
- y a-t-il un moyen d'obtenir d:s:L pour inclure des migrations d'insertion de données?
- ne devrais-je pas utiliser les migrations pour insérer des données de cette façon?
- ne devrais-je pas être pré-remplissage de la base de données avec des données? Dois-je mettre à jour le code de l'application de manière à ce qu'il traite le cas où il n'y a pas d'utilisateurs avec élégance, et laisse un compte utilisateur initial être créé en direct à partir de l'application?
- D'autres options? :)
13 réponses
essayez une tâche de râteau. Par exemple:
- Créer le fichier /lib/tasks/bootstrap.râteau
- dans le fichier, ajouter une tâche pour créer votre utilisateur par défaut:
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
- ensuite, lorsque vous configurez votre application pour la première fois, vous pouvez faire rake db:migrate ou rake db:schema:load, puis faire rake bootstrap:all.
utiliser db/seed.rb
dans toutes les applications de Rails.
alors que certaines réponses données ci-dessus de 2008 peuvent bien fonctionner, ils sont assez périmés et ils ne sont pas vraiment Rails convention plus.
la saisie des données initiales dans la base de données doit se faire au moyen du fichier db/seed.rb
.
ça marche comme un fichier Ruby.
pour créer et sauvegarder un objet, vous pouvez faire quelque chose comme :
User.create(:username => "moot", :description => "king of /b/")
une fois que vous avez ce fichier prêt, vous pouvez faire ce qui suit
rake db:migrate
rake db:seed
ou en un seul pas
rake db:setup
votre base de données doit être remplie avec n'importe quel objet que vous vouliez créer dans seed.rb
je recommande de ne pas insérer de données nouvelles dans migrations. Au lieu de cela, modifiez seulement les données existantes dans les migrations.
pour insérer des données initiales, je vous recommande D'utiliser YML. Dans chaque projet de Rails que j'installe, je crée un répertoire fixtures sous le répertoire DB. Puis je crée des fichiers YML pour les données initiales tout comme les fichiers YML sont utilisés pour les données de test. Puis j'ajoute une nouvelle tâche pour charger les données des fichiers YML.
lib/tasks/db.râteau:
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: "test@example.com"
hashed_password: "656fc0b1c1d1681840816c68e1640f640c6ded12"
salt: "188227600.754087929365988"
C'est ma nouvelle solution préférée, en utilisant les gemmes de populator et de faker:
je suppose que la meilleure option est le numéro 3, principalement parce que de cette façon il n'y aura pas d'utilisateur par défaut qui est un excellent moyen de rendre autrement bonne sécurité inutile.
j'ai pensé résumer quelques-unes des grandes réponses que j'ai eues à cette question, ainsi que mes propres pensées maintenant je les ai toutes lues:)
il y a deux questions distinctes ici:
- dois-je pré-remplir la base de données avec mon utilisateur "administrateur" spécial? Ou l'application doit-elle fournir un moyen de s'organiser lorsqu'elle est utilisée pour la première fois?
- Comment peut-on pré-remplir la base de données avec des données? À noter que c'est valable question indépendamment de la réponse à la partie 1: Il existe d'autres scénarios d'utilisation pour la pré-population qu'un utilisateur administrateur.
Pour (1), il semble que la mise en place du premier utilisateur à partir de l'application elle-même est tout à fait un peu de travail supplémentaire, pour la fonctionnalité qui est, par définition, presque jamais utilisé. Il peut être légèrement plus sûr, cependant, car il oblige l'utilisateur à définir un mot de passe de son choix. La meilleure solution est entre ces deux extrêmes: avoir un script (ou tâche rake, ou quoi que ce soit) pour configurer l'utilisateur initial. Le script peut alors être configuré pour remplir automatiquement un mot de passe par défaut pendant le développement, et pour exiger qu'un mot de passe soit entré pendant l'installation/le déploiement de la production (si vous voulez décourager un mot de passe par défaut pour l'administrateur).
(2), il apparaît qu'il existe un certain nombre de bonnes, des solutions valables. Une tâche de râteau semble une bonne façon, et il y a quelques plugins pour rendre cela encore plus facile. Il suffit de regarder à travers quelques-unes des autres réponses pour voir les détails de ceux:)
envisager d'utiliser la console des rails. Bon pour les tâches d'administration ponctuelles où il n'est pas la peine de mettre en place un script ou une migration.
sur votre machine de production:
script/console production
... puis. ..
User.create(:name => "Whoever", :password => "whichever")
si vous générez cet utilisateur initial plus d'une fois, alors vous pouvez aussi ajouter un script dans RAILS_ROOT/script/, et l'exécuter à partir de la ligne de commande sur votre machine de production, ou via une tâche capistrano.
cette tâche de râteau peut être fourni par le plugin db-populate:
grand billet de blog sur ce: http://railspikes.com/2008/2/1/loading-seed-data
j'utilisais les suggestions de Jay d'un ensemble spécial de fixtures, mais je me suis vite retrouvé à créer des données qui ne seraient pas possibles en utilisant les modèles directement (entrées non suivies en versions quand j'utilisais acts_as_versioned)
je le garderais dans une migration. Bien qu'il soit recommandé d'utiliser le schéma pour les configurations initiales, la raison en est qu'il est plus rapide, évitant ainsi les problèmes. Une seule migration supplémentaire pour les données devrait suffire.
vous pouvez également ajouter les données dans le fichier de schéma, car c'est le même format que les migrations. Vous perdriez la fonction d'auto-génération.
pour les utilisateurs et les Groupes, la question des utilisateurs préexistants devrait être définie en fonction des besoins de l'application plutôt que des contingences de la programmation. Peut-être que votre application nécessite un administrateur; puis préremplir. Ou peut - être pas-puis ajouter du code pour demander gracieusement une configuration utilisateur à l'Heure de lancement de l'application.
sur la question plus générale, il est clair que de nombreuses applications Rails peuvent bénéficier de la date pré-remplie. Par exemple, une adresse tenue la demande peut également contenir tous les États et leurs abréviations. Pour ces cas, les migrations sont vos amis, je crois.
certaines des réponses sont périmées. Depuis Rails 2.3.4, il existe une caractéristique simple appelée Seed disponible dans db/seed.rb
:
#db/seed.rb
User.create( :name => 'default', :password => 'password' )
Comment.create( :title => 'Title', :body => 'First post!' )
il fournit une nouvelle tâche de râteau que vous pouvez utiliser après vos migrations pour charger des données :
rake db:seed
de la Graine.rb est un fichier Ruby classique, n'hésitez pas à utiliser n'importe quelle structure de données classique (tableau, hachures, etc.) et des itérateurs pour ajouter vos données :
["bryan", "bill", "tom"].each do |name|
User.create(:name => name, :password => "password")
end
si vous voulez ajouter des données avec des caractères UTF-8 (très courant en français, espagnol, allemand, etc.), n'oubliez pas d'ajouter au début du fichier :
# ruby encoding: utf-8
Ce Railscast est une bonne introduction : http://railscasts.com/episodes/179-seed-data