61 votes

Comment (et si) renseigner l'application Rails avec les données initiales

J'ai une application rails où les utilisateurs doivent ouvrir une session. Par conséquent, pour que l'application soit utilisable, il doit y avoir une initiale de l'utilisateur dans le système pour la première personne à se connecter avec (ils peuvent ensuite créer des utilisateurs). 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 être à l'aide de db:schéma:la charge, plutôt que de courir les migrations, afin de mettre en place de nouvelles bases de données sur les nouvelles machines de développement. Malheureusement, cela ne semble pas inclure les migrations qui insérer des données, seuls ceux qui a mis en place des tables, clés, etc.

Ma question est, quelle est la meilleure façon de gérer cette situation:

  1. Est-il possible d'obtenir d:s:l pour inclure des données d'insertion des migrations?
  2. Ne dois-je pas à l'aide de migrations à tous pour insérer des données de cette façon?
  3. Ne dois-je pas être pré-remplissage de la base de données avec des données? Dois-je mettre à jour le code de l'application pour qu'elle traite les cas où il n'y a pas d'utilisateurs gracieusement, et permet un premier compte utilisateur sera créé live à partir de l'application?
  4. D'autres options? :)

46voto

Aaron Wheeler Points 470

Essayez une tâche de rake. Par exemple:

  1. Créez le fichier /lib/tasks/bootstrap.rake
  2. Dans le fichier, ajoutez 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.

35voto

dmtri.com Points 4910

Utiliser db/seed.rb trouvés dans chaque application Rails.

Alors que certaines réponses données ci-dessus à partir de 2008 peut bien fonctionner, ils sont assez obsolète et qu'ils ne sont pas vraiment des Rails convention plus.

Le remplissage initial des données dans la base de données doit être faite avec db/seed.rb le fichier.

C'est juste fonctionne comme un fichier Ruby.

Afin de créer et d'enregistrer un objet, vous pouvez faire quelque chose comme :

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

Une fois que vous avez ce fichier, vous pouvez effectuer les opérations suivantes

rake db:migrate

rake db:seed

Ou en une seule étape

rake db:setup

Votre base de données doit être rempli avec selon les objets que vous vouliez créer dans la semence.rb

32voto

Jay Stramel Points 1265

Je vous recommande de ne pas insérer de nouvelles données sur les migrations. Au lieu de cela, seulement modifier des données existantes dans les migrations.

Pour l'insertion de données initiales, je vous recommande d'utiliser YML. Dans tous les Rails de projet, j'ai de l'installation, j'ai créer un agencements répertoire sous le répertoire DB. Puis-je créer des fichiers YML pour les données initiales comme YML fichiers sont utilisés pour les données de test. Puis-je ajouter une nouvelle tâche pour charger les données à partir 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/utilisateurs.yml:

test:
  customer_id: 1
  name: "Test Guy"
  email: "test@example.com"
  hashed_password: "656fc0b1c1d1681840816c68e1640f640c6ded12"
  salt: "188227600.754087929365988"

6voto

DEfusion Points 2793

Essayez le plug - in seed-fu , qui est un simple plug-in qui vous permet de créer des données (et de modifier ces données dans le futur), vous permettra également de générer des données spécifiques à un environnement et des données pour tous les environnements.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X