web-dev-qa-db-fra.com

Quel est le meilleur moyen de créer une base de données dans Rails?

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.

76
Tony

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")
109
ajhit406

Deux types de données de départ sont généralement nécessaires.

  • Données de base sur lesquelles le noyau de votre application peut s’appuyer. J'appelle cela les graines communes.
  • Données environnementales , par exemple, pour développer l'application, il est utile de disposer d'un tas de données dans un état connu que nous pouvons utiliser pour travailler sur l'application localement. (La réponse de Factory Girl ci-dessus couvre ce type de données).

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.

27
james2m

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
25
Hates_

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
22
Yuri

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.

1
SimonW