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
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
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)"
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/
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
L'utilisation peut utiliser des données de départ, c'est un excellent moyen pour cela! http://railscasts.com/episodes/179-seed-data