Question

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

La façon dont je l'ai configuré maintenant est que j'ai un tas d'instructions de création dans des fichiers dans /db/fixtures et une tâche 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 souhaite installer des thèmes 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 « Rouge », alors je voudrais simplement ajouter l'instruction de thème à ce fichier de luminaire et appeler la tâche rake pour réamorcer la base de données.Si je fais cela, parce 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 la suivante : est-ce un bon moyen de gérer l'amorçage d'une base de données ?Dans un article précédent, cela m'avait été recommandé.

Si oui, comment puis-je coder en dur les identifiants, et y a-t-il des inconvénients à cela ?

Si non, quelle est la meilleure façon 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.

Était-ce utile?

La solution

La mise à jour étant donné que ces réponses sont un peu dépassés (bien que certains appliquent encore).

Simple fonction ajoutée dans des rails 2.3.4, db / seeds.rb

Fournit une nouvelle tâche de râteau

rake db:seed

Bon pour le remplissage des documents statiques communs comme les états, pays, etc ...

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

* Notez que vous pouvez utiliser des appareils si vous aviez déjà les créé pour remplir aussi avec la db: tâche de semences en mettant ce qui suit dans votre fichier seeds.rb (de l'épisode Railscast):

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

Pour 3.x Rails utilisation ActiveRecord :: Les luminaires à tubes »au lieu de la constante 'Fixtures'

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

Autres conseils

En général, il existe 2 types de données de semences nécessaires.

  • Données de base sur lequel le noyau de votre application peut compter. J'appelle cela les graines communes.
  • Données environnementales , par exemple pour développer l'application, il est utile d'avoir un tas de données dans un état connu qui nous pouvons utiliser pour travailler sur l'application locale (la réponse Factory Girl ci-dessus couvre cette type de données).

Dans mon expérience, je rentrais toujours sur la nécessité pour ces deux types de données. Donc, je mets ensemble un petit bijou qui étend les graines de Rails et vous permet d'ajouter plusieurs fichiers de semences communes sous db / graines / et toutes les données de semences sous l'environnement db / graines / ENV par exemple db / graines / développement.

J'ai trouvé cette approche est assez pour donner mes données semencières une certaine structure et me donne le pouvoir de créer mon environnement de développement ou la mise en scène dans un état connu simplement en exécutant:

rake db:setup

Les luminaires à tubes sont fragiles et squameuse de maintenir, comme les dépotoirs sql réguliers.

factory_bot sonne comme il 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')

Lorsqu'il est utilisé avec Faker il peut remplir une base de données très rapidement avec les associations sans avoir à déconner avec les appareils (beurk).

J'ai le code comme celui-ci dans une tâche de râteau.

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

Utilisation de fichier seeds.rb ou FactoryBot est grande, mais ceux-ci sont respectivement parfaits pour des structures de données fixes et les tests.

Le seedbank joyau pourrait vous donner plus de contrôle et de modularité à vos graines. Il insère des tâches de râteau et vous pouvez également définir des dépendances entre vos graines. Votre liste de tâches de coupe 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 construit dans le moyen de semences données comme expliqué .

Une autre façon serait d'utiliser un petit bijou pour plus d'ensemencement avancé ou facile, tels que:. seedbank

Le principal avantage de ce petit bijou et la raison pour laquelle je l'utilise est qu'il a des capacités avancées telles que les dépendances de chargement de données et par l'environnement des données de semences.

Ajout d'une réponse à jour que cette réponse a été d'abord sur google.

Ajoutez-le dans les migrations de bases de données, de cette façon tout le monde l'obtiendra lors de la mise à jour.Gérez toute votre logique dans le code Ruby/Rails, afin de ne jamais avoir à vous soucier des paramètres d'identification explicites.

La meilleure façon est d'utiliser des appareils.

Note:. Gardez à l'esprit que les appareils ne inserts directs et ne pas utiliser votre modèle, donc si vous avez callbacks peuplant les données que vous aurez besoin de trouver une solution de contournement

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top