2010-09-16 4 views
0

Je suis en train d'exécuter la migration suivantequestion Authlogic seulement dans la migration dans des rails 3 projets

def self.up 
    add_column :users, :perishable_token, :string 
    User.all.each { |u| u.reset_perishable_token! } 
    change_column :users, :perishable_token, :string, :null => false 

    add_index :users, :perishable_token 
end 

et le code u.reset_perishable_token! comporte de manière étrange (pas de valeur de retour, ne change pas le champ de base de données). Par conséquent change_column ..., :null => false échoue avec

users.perishable_token may not be NULL 

séparant Même la migration en deux ne fait pas l'affaire soit si je les exécute avec une seule commande de râteau.

Première partie

def self.up 
    add_column :users, :perishable_token, :string 

    add_index :users, :perishable_token 
end 

Deuxième partie

def self.up 
    User.all.each { |u| u.reset_perishable_token! } 
    change_column :users, :perishable_token, :string, :null => false 
end 

Seulement si je lance la première et la deuxième migration de rake processus séparés tout fonctionne bien.

Quelle pourrait être la raison et comment puis-je le réparer?

Répondre

1

Je pense que vous devez ajouter ...

User.reset_column_information 

... après avoir ajouté les perishable_token au users_table, sinon le modèle de l'utilisateur est hors de synchronisation avec la base de données.

Je pense que le modèle User ne serait chargé qu'une seule fois par 'rake db: migrate', donc il ne serait pas utile de diviser la migration en deux.