web-dev-qa-db-fra.com

Comment ajouter des insertions dans la migration Rails?

Après avoir créé une table (par migration), je souhaite insérer directement certaines entrées. Comment dois-je écrire une migration pour cela?

merci

38
xaver23

Mise à jour: C'est la bonne réponse: https://stackoverflow.com/a/2667747/7852


Voici un exemple de Ruby sur Rails api :

 class AddSystemSettings < ActiveRecord::Migration
    # create the table
    def self.up
      create_table :system_settings do |t|
        t.string  :name
        t.string  :label
        t.text  :value
        t.string  :type
        t.integer  :position
      end

      # populate the table
      SystemSetting.create :name => "notice", :label => "Use notice?", :value => 1
    end

    def self.down
      drop_table :system_settings
    end
  end
12
Ju Nogueira

Ne le faites pas . Si vous recherchez des données de départ, vous devez utiliser db/seeds.rb et rake db:seed au lieu. Plus d'informations dans ce Railscast .

Remarque: assurez-vous toujours que le code dans db/seeds.rb est idempotent. c'est-à-dire qu'il devrait toujours être sûr de relancer vos graines.

Mais, si vous devez insérer ou modifier des données dans une migration (il existe des cas d'utilisation légitimes pour cela), il est préférable d'utiliser des instructions SQL à la place. Votre classe de modèle n'est pas garantie d'être toujours sous la même forme dans une future version de votre application, et l'exécution des migrations à partir de zéro à l'avenir pourrait générer des erreurs si vous référencez directement la classe de modèle.

execute "insert into system_settings (name, label, value) values ('notice', 'Use notice?', 1)"
92
Ryan McGeary

Edit: S'IL VOUS PLAÎT NOTE - Les affiches ci-dessus sont correctes, vous ne devez pas remplir la base de données à l'intérieur des migrations. Ne l'utilisez pas pour ajouter de nouvelles données, uniquement pour modifier les données dans le cadre de la modification du schéma.

Pour beaucoup de choses, l'utilisation de SQL brut sera préférable, mais si vous devez insérer des données dans le cadre d'une migration (par exemple, effectuer une conversion de données lors du découpage d'une table en plusieurs tables), et que vous voulez des choses AR par défaut comme une base de données pratique -échappement indépendant, vous pouvez définir une version locale de la classe modèle:

class MyMigrationSucksALittle < ActiveRecord::Migration
  class MyModel < ActiveRecord::Base
    # empty guard class, guaranteed to have basic AR behavior
  end

  ### My Migration Stuff Here
  ### ...

end

Notez que cela fonctionne mieux pour les cas simples; puisque la nouvelle classe est dans un espace de noms différent (MyMigrationSucksALittle::MyModel), les associations polymorphes déclarées dans le modèle de garde ne fonctionneront pas correctement.

Un aperçu un peu plus détaillé des options disponibles se trouve ici: http://railsguides.net/2014/01/30/change-data-in-migrations-like-a-boss/

5
David Mayo

créer un nouveau fichier de migration comme 047_add_rows_in_system_settings.rb

 class AddRowsInAddSystemSettings < ActiveRecord::Migration
        def self.up
          SystemSetting.create{:name => "name1", :label => "Use notice?", :value => 1}
          SystemSetting.create{:name => "name2", :label => "Use notice?", :value => 2}
         end

        def self.down
          SystemSetting.delete_all
        end
      end

OR

lors de la création de la table

046_system_settings.rb

class AddSystemSettings < ActiveRecord::Migration
    def self.up
      create_table :system_settings do |t|
        t.string  :name
        t.string  :label
        t.text  :value
        t.string  :type
        t.integer  :position
      end

      SystemSetting.create :name => "notice", :label => "Use notice?", :value => 1
    end

    def self.down
      drop_table :system_settings
    end
  end

Réf: - http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

4
Salil

L'utilisation peut utiliser des données de départ, c'est un excellent moyen pour cela! http://railscasts.com/episodes/179-seed-data

0
Jeremie Ges