86 votes

Quelle est la meilleure façon d'amorcer une base de données dans les Rails?

J'ai une tâche rake qui remplit certaines données initiales dans mon application rails. Par exemple, des pays, des états, des opérateurs de téléphonie mobile, etc.

La façon dont je l'ai mis jusqu'à maintenant, j'ai un tas de créer des instructions dans les fichiers de /db/fixtures et une tâche rake qui les traite. Par exemple, un modèle que j'ai est de thèmes. J'ai un thème.rb fichier dans /db/luminaires qui ressemble à ceci:

Theme.delete_all
Theme.create(:id => 1, :name=>'Lite', :background_color=>'0xC7FFD5', :title_text_color=>'0x222222',
                      :component_theme_color=>'0x001277', :carrier_select_color=>'0x7683FF', :label_text_color=>'0x000000',
                      :join_upper_gradient=>'0x6FAEFF', :join_lower_gradient=>'0x000000', :join_text_color=>'0xFFFFFF',
                      :cancel_link_color=>'0x001277', :border_color=>'0x888888', :carrier_text_color=>'0x000000', :public => true)

Theme.create(:id => 2, :name=>'Metallic', :background_color=>'0x000000', :title_text_color=>'0x7299FF',
                      :component_theme_color=>'0xDBF2FF', :carrier_select_color=>'0x000000', :label_text_color=>'0xDBF2FF',
                      :join_upper_gradient=>'0x2B25FF', :join_lower_gradient=>'0xBEFFAC', :join_text_color=>'0x000000',
                      :cancel_link_color=>'0xFF7C12', :border_color=>'0x000000', :carrier_text_color=>'0x000000', :public => true)

Theme.create(:id => 3, :name=>'Blues', :background_color=>'0x0060EC', :title_text_color=>'0x000374',
                      :component_theme_color=>'0x000374', :carrier_select_color=>'0x4357FF', :label_text_color=>'0x000000',
                      :join_upper_gradient=>'0x4357FF', :join_lower_gradient=>'0xffffff', :join_text_color=>'0x000000',
                      :cancel_link_color=>'0xffffff', :border_color=>'0x666666', :carrier_text_color=>'0x000000', :public => true)
puts "Success: Theme data loaded"

L'idée ici est que je veux installer un stock de thèmes pour que les utilisateurs commencent avec. J'ai un problème avec cette méthode.

Réglage de l'ID ne fonctionne pas. Cela signifie que si je décide d'ajouter un thème, nous allons l'appeler "Rouge", alors je voudrais simplement ajouter le thème de la déclaration de ce match de fichier et l'appel de la tâche rake pour réensemencer la base de données. Si je le fais, parce que les thèmes qui appartiennent à d'autres objets et leurs id de changements lors de cette ré-initialisation, tous les liens sont rompus.

Ma question est tout d'abord, est-ce un bon moyen de traiter l'ensemencement d'une base de données? Dans un précédent post, cela m'a été recommandé.

Si oui, comment puis-je coder en dur l'IDs, et quels sont les inconvénients?

Si non, quel est le meilleur moyen de semences de la base de données?

Je vais vraiment apprécier longtemps pensé et réponses qui intègrent les meilleures pratiques.

Merci!!!!

116voto

ajhit406 Points 962

La mise à jour étant donné que ces réponses sont légèrement dépassé (bien que certains continuent à s'appliquer).

Simple fonctionnalité ajoutée dans les rails 2.3.4, db/graines.rb

Fournit une nouvelle tâche rake

rake db:seed

Bon, pour l'alimentation commune des enregistrements statiques comme les états, les pays, etc...

http://railscasts.com/episodes/179-seed-data

*Notez que vous pouvez utiliser luminaires, si vous aviez déjà créé eux aussi la remplir avec de la db:les semences de la tâche en mettant à la suite de vos graines.rb fichier (à partir de la railscast épisode):

require 'active_record/fixtures'
Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "operating_systems")

Pour Rails 3.x utiliser 'ActiveRecord::Fixtures" au lieu de "Fixtures" constante

require 'active_record/fixtures'
ActiveRecord::Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "fixtures_file_name")

29voto

james2m Points 884

Habituellement, il y a 2 types de graines de données requis. 1. base de données sur lesquelles le cœur de votre application peut s'appuyer. J'appelle cela de la commune de graines. Il y a ensuite les données sur l'environnement, par exemple pour développer l'application, il est utile d'avoir un tas de données dans un état connu que nous pouvons utiliser pour travailler sur l'application localement (la Factory Girl réponse ci-dessus couvre ce type de données).

Dans mon expérience, j'ai toujours été à venir à travers la nécessité pour ces deux types de données. J'ai donc monté un petit bijou qui s'étend de Rails de graines et vous permet d'ajouter plusieurs communes de graines de fichiers sous db/graines et de l'environnement de la graine de données en vertu de l'db/graines/ENV par exemple db/graines de développement.

J'ai trouvé cette approche est assez pour donner mon graines de données de la structure, et donne-moi la puissance de l'installation de mon développement ou la mise en scène de l'environnement dans un état connu seulement à la baisse d'un;

$ rake db:le programme d'installation

Absolument oublier les montages, ils sont fragiles et pâte à maintenir, comme le sont d'ordinaire de sessions sql.

27voto

Hates_ Points 8657

factory_girl sonne comme il va faire ce que vous essayez d'atteindre. Vous pouvez définir tous les attributs communs dans la définition par défaut et ensuite de les remplacer au moment de la création. Vous pouvez également passer une id à l'usine:

Factory.define :theme do |t|
  t.background_color '0x000000'
  t.title_text_color '0x000000',
  t.component_theme_color '0x000000'
  t.carrier_select_color '0x000000'
  t.label_text_color '0x000000',
  t.join_upper_gradient '0x000000'
  t.join_lower_gradient '0x000000'
  t.join_text_color '0x000000',
  t.cancel_link_color '0x000000'
  t.border_color '0x000000'
  t.carrier_text_color '0x000000'
  t.public true
end

Factory(:theme, :id => 1, :name => "Lite", :background_color => '0xC7FFD5')
Factory(:theme, :id => 2, :name => "Metallic", :background_color => '0xC7FFD5')
Factory(:theme, :id => 3, :name => "Blues", :background_color => '0x0060EC')

Lorsqu'il est utilisé avec faker il peut remplir une base de données très rapidement avec des associations sans avoir à se soucier avec accessoires (beurk).

J'ai ce type de code dans une tâche rake.

100.times do
    Factory(:company, :address => Factory(:address), :employees => [Factory(:employee)])
end

27voto

Yuri Points 2258

À l'aide de seeds.rb le fichier ou FactoryGirl est grande, mais celles-ci sont respectivement idéal pour les structures de données et les tests.

L' seedbank gem pourrait vous donner plus de contrôle et de modularité de vos graines. Il insère un râteau de tâches et vous pouvez également définir des dépendances entre vos graines. Votre tâche rake liste de ces ajouts (par exemple):

rake db:seed                    # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/ENVIRONMENT/*.seeds.rb. ENVIRONMENT is the current environment in Rails.env.
rake db:seed:bar                # Load the seed data from db/seeds/bar.seeds.rb
rake db:seed:common             # Load the seed data from db/seeds.rb and db/seeds/*.seeds.rb.
rake db:seed:development        # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/development/*.seeds.rb.
rake db:seed:development:users  # Load the seed data from db/seeds/development/users.seeds.rb
rake db:seed:foo                # Load the seed data from db/seeds/foo.seeds.rb
rake db:seed:original           # Load the seed data from db/seeds.rb

2voto

YenTheFirst Points 1227

Au lieu d'utiliser explicite crée, utilisez les fichiers YAML. Avec une syntaxe simple, vous pouvez remplir toutes les valeurs d'un objet. En fait, si vous savez quelque chose sur les rails de test, c'est la façon standard de graines de la base de données de test. Découvrez ces pages:
http://railspikes.com/2008/2/1/loading-seed-data http://quotedprintable.com/2007/11/16/seed-data-in-rails

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