J'ai une tâche rake qui remplit des données initiales dans mon Rails. Par exemple, pays, états, opérateurs de téléphonie mobile, etc.
La façon dont je l’ai configuré maintenant, c’est que j’ai un tas d’instructions create dans des fichiers dans/db/fixtures et une tâche de rake qui les traite. Par exemple, un modèle que j'ai est celui des thèmes. J'ai un fichier theme.rb dans/db/fixtures 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 des thèmes de stock pour les utilisateurs pour commencer. J'ai un problème avec cette méthode.
La définition de l'ID ne fonctionne pas. Cela signifie que si je décide d'ajouter un thème, appelons-le 'Red', j'aimerais simplement ajouter l'instruction de thème à ce fichier de fixture et appeler la tâche rake pour réensemencer la base de données. Si je le fais, étant donné que les thèmes appartiennent à d'autres objets et que leur identifiant change lors de cette réinitialisation, tous les liens sont rompus.
Ma question est tout d’abord, s’agit-il d’un bon moyen de gérer l’ensemencement d’une base de données? Dans un post précédent, cela m'a été recommandé.
Si tel est le cas, comment puis-je coder en dur les identifiants et y a-t-il des inconvénients à cela?
Si non, quel est le meilleur moyen d'amorcer la base de données?
J'apprécierai vraiment les réponses longues et réfléchies qui intègrent les meilleures pratiques.
Mise à jour depuis ces réponses sont légèrement obsolètes (bien que certaines s'appliquent toujours).
Fonctionnalité simple ajoutée dans Rails 2.3.4, db/seeds.rb
Fournit une nouvelle tâche de rake
rake db:seed
Bon pour peupler les enregistrements statiques communs comme les états, les pays, etc ...
http://railscasts.com/episodes/179-seed-data
* Notez que vous pouvez utiliser des fixtures si vous les aviez déjà créées pour les peupler également avec la tâche db: seed en insérant ce qui suit dans votre fichier seeds.rb (à partir de l'épisode railscast):
require 'active_record/fixtures'
Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "operating_systems")
Pour Rails 3.x, utilisez 'ActiveRecord :: Fixtures' au lieu de la constante 'Fixtures'
require 'active_record/fixtures'
ActiveRecord::Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "fixtures_file_name")
Deux types de données de départ sont généralement nécessaires.
D'après mon expérience, je rencontrais toujours le besoin de ces deux types de données. J'ai donc mis ensemble n petit bijou qui étend les graines de Rails et vous permet d'ajouter plusieurs fichiers de semences communs sous db/seed/et toutes les données de semences environnementales sous db/graines/ENV, par exemple db/graines/development. .
J'ai trouvé cette approche suffisante pour donner une certaine structure à mes données de départ et me donner le pouvoir de configurer mon environnement de développement ou de transfert dans un état connu en exécutant simplement:
rake db:setup
Les luminaires sont fragiles et difficiles à entretenir, tout comme les dumps SQL classiques.
factory_bot semble que cela fera ce que vous essayez d'atteindre. Vous pouvez définir tous les attributs communs dans la définition par défaut, puis les remplacer au moment de la création. Vous pouvez également passer un identifiant à 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')
Utilisé avec faker, il peut peupler une base de données très rapidement avec des associations sans avoir à jouer avec les fixations (beurk).
J'ai un code comme celui-ci dans une tâche de rake.
100.times do
Factory(:company, :address => Factory(:address), :employees => [Factory(:employee)])
end
En utilisant seeds.rb
fichier ou FactoryBot
est génial, mais ils sont parfaits pour les structures de données fixes et les tests.
La gemme seedbank
peut vous donner plus de contrôle et de modularité pour vos semences. Il insère des tâches rake et vous pouvez également définir des dépendances entre vos graines. Votre liste de tâches de rake aura 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
Rails a une méthode intégrée pour générer des données comme expliqué ici .
Une autre solution consisterait à utiliser un bijou pour un semis plus avancé ou plus facile, tel que: banque de semences .
Le principal avantage de cette gemme et la raison de mon utilisation réside dans le fait qu’il dispose de fonctionnalités avancées telles que les dépendances de chargement de données et les données de départ par environnement.
Ajouter une réponse à jour car cette réponse était d'abord sur Google.