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:

  1. y a-t-il un moyen d'obtenir d:s:L pour inclure des migrations d'insertion de données?
  2. ne devrais-je pas utiliser les migrations pour insérer des données de cette façon?
  3. 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?
  4. D'autres options? :)
60
demandé sur Community 2008-09-15 15:25:19

13 réponses

essayez une tâche de râteau. Par exemple:

  1. Créer le fichier /lib/tasks/bootstrap.râteau
  2. 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
  1. 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.
46
répondu Aaron Wheeler 2008-09-16 13:16:07

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

33
répondu Jason Kim 2014-01-21 06:47:44

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"
32
répondu Jay Stramel 2009-02-18 01:43:20

C'est ma nouvelle solution préférée, en utilisant les gemmes de populator et de faker:

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

9
répondu 2008-09-16 12:37:43

essayez le seed-fu plugin, qui est un plugin assez simple qui vous permet de seed data (et de modifier que seed data dans le futur), vous permettra également de seed environment specific data and data for all environments.

6
répondu DEfusion 2008-09-16 09:17:04

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.

4
répondu Vinko Vrsalovic 2008-09-15 11:36:20

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:

  1. 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?
  2. 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:)

4
répondu Luke Halliwell 2008-09-16 19:42:43

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.

3
répondu Trevor Stow 2008-09-15 12:04:04

cette tâche de râteau peut être fourni par le plugin db-populate:

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

3
répondu pantulis 2008-09-15 21:04:17

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)

3
répondu Kevin Davis 2010-09-10 03:48:40

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.

2
répondu MattW. 2008-09-15 11:33:31

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.

2
répondu NickR 2008-09-15 17:00:58

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

1
répondu frenci 2014-01-21 11:08:32