2017-10-06 1 views
1

J'ai une ancienne migration qui ajoute une colonne dans une table, puis ajoute immédiatement des données dans cette colonne.Ajouter une colonne dans la migration des rails mais la colonne n'existe pas immédiatement

def change 
    add_column :table_name, :column_name, :string 

    TableName.create(
    column_name: "some string" 
) 
end 

Maintenant, chaque fois que je dois relancer rake db:migrate après avoir abandonné la base de données, je reçois cette erreur

NoMethodError: undefined method `column_name=' for #< TableName:0x007fa483a18838>

Cette migration a travaillé quand il a été initialement créé, pourquoi ça ne marche pas si j'exécutez à nouveau cette migration? Je comprends que ce n'est pas une bonne pratique, mais mes recherches indiquent que cela devrait encore fonctionner.

+2

Avez-vous essayé https://stackoverflow.com/questions/9115347/model-reset-column-information-does-not-reload-columns-in-rails-migration? – fanta

+0

parfait, cela a fonctionné. merci @fanta – davidhu2000

Répondre

0

Je ne recommanderais pas de modifier les données dans les migrations. C'est généralement anti-pattern. Il est recommandé de faire la migration de données à l'intérieur d'une tâche de coupe:

namespace :table_names do 
    task :create_first_table_name do 
    TableName.create(
     column_name: "some string" 
    ) 
    end 
end 

Lire Data Migrations in Rails si vous voulez en savoir plus sur les migrations de données

0

https://stackoverflow.com/a/46613312/1949363 est une réponse solide et typiquement un modèle à suivre.

Par ailleurs, si les données doivent être là pour la migration de maintenir l'application dans un état valide, vous pouvez écrire SQL brut dans la migration et insérer des données en utilisant

ActiveRecord::Base.connection.execute(...)