2010-11-14 3 views
9

Я перехожу из Authlogic в Devise.Утилита миграции на существующую модель

ОБНОВЛЕНО:

Миграция завещанию пытается воссоздать пользователей таблицы, так что я изменился, как вы можете увидеть ниже create_table в change_table и удалить таблицу в конце, чтобы удалить то, что я добавить

Проблема в том, что когда я запускаю rake, я получаю сообщение об ошибке.

Это ошибка, которую я получаю при работе рейка.

== DeviseCreateUsers: migrating ============================================== 
-- change_table(:users) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

SQLite3::SQLException: duplicate column name: email: ALTER TABLE "users" ADD "email" varchar(255) DEFAULT '' NOT NULL 

Это миграция

class DeviseCreateUsers < ActiveRecord::Migration 
    def self.up 
    change_table(:users) do |t| 
     t.database_authenticatable :null => false 
     t.recoverable 
     t.rememberable 
     t.trackable 

     # t.confirmable 
     # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both 
     # t.token_authenticatable 


     t.timestamps 
    end 

    add_index :users, :email,    :unique => true 
    add_index :users, :reset_password_token, :unique => true 
    # add_index :users, :confirmation_token, :unique => true 
    # add_index :users, :unlock_token,   :unique => true 
    end 

    def self.down 
    remove_column :users, :database_authenticatable 
    remove_column :users, :recoverable 
    remove_column :users, :rememberable 
    remove_column :users, :trackable 
    remove_index :users, :email 
    remove_index :users, :reset_password_token 
    end 
end 

В моей schema.rb я уже это от Authlogic.

create_table "users", :force => true do |t| 
    t.string "username" 
    t.string "email" 
    t.string "crypted_password" 
    t.string "password_salt" 
    t.string "persistence_token" 

Я думаю, что он видит какой-то конфликт, что я не в состоянии понять, как избежать с теми, разработать хелперы

Спасибо!

+0

Пожалуйста, отметьте ответ jamuraa правильно. В противном случае этот вопрос появляется в «списке без ответа». – kikito

ответ

22

Ошибка, которую вы получаете, потому что вы пытаетесь воссоздать поле email, которое у вас уже есть. Поле email создано в помощнике при создании t.database_authenticatable.Вы можете использовать свою старую таблицу пользователей с новой системой, но вам не нужно включать t.database_authenticatable, вам просто нужно переименовать старые имена полей. Глядя в Documentation for Devise, вы можете видеть, что database_authenticatable просто создает три поля: email, encrypted_password и password_salt. Они такие же, как электронная почта, crypted_password и password_salt, что у вас уже есть в вашем authlogic столе пользователя, так что вы можете использовать change_table так:

def self.up 
    change_table(:users) do |t| 
    t.recoverable 
    t.trackable 
    # rememberable uses remember_token, but this field is different 
    t.rename :remember_token_expires_at, :remember_created_at 
    # these fields are named differently in devise 
    t.rename :crypted_password, :encrypted_password 
    end 
end 
+0

Благодарим вас за ответ. Уже решена проблема! – Martin

+3

Можете ли вы ответить или обновить исходный вопрос своим решением для других? – gallamine

0
add_column(:users, :database_authenticatable, {:null=>false}) 

Вы не предоставляете информацию о том, как это поле должно быть настроено. Я думаю, это должна быть строка, поэтому вы хотите передать эту информацию.

add_column :users, :database_authenticatable, :string, :null=>false 

Более подробную информацию об ошибке вы получаете:

undefined method `to_sym' 

Эта ошибка для миграции действительно расстраивает, потому что ему не хватает содержания, но что это означает, что вы получили миграцию в неправильном порядке.

Например - если добавить булево файл модели использования:

add_column :users, :user_is_a_jackass, :boolean, :default => false 

Это перенесет нормально. Но если вы делаете это так:

add_column :users, :user_is_a_jackass, :default => false 

вы получите ту же ошибку, потому что вы не говорите миграции, какой тип поля оно должно быть.

+0

Благодарим вас за ответ. То, что вы сказали, правда, однако я понимаю, что исходная миграция использует помощников-помощников, и именно поэтому я считаю, что миграция избегала определения типа. Я понял, я могу изменить create_table на change_table, и я просто обновляю проблему. – Martin

4

Вместо изменения create_table к change_table, вы можете просто добавить следующую строку непосредственно перед create_table:

rename_table :users, :old_users_authlogic 

Затем, сразу после create_table:

say_with_time 'Migrating users from Authlogic to Devise...' do 
    execute "INSERT INTO users (id, email, ...) SELECT id, email FROM old_users_authlogic" 
end 

Если вы используете индексов с ссылочной целостности, не забудьте обновить их до новой таблицы, так как rename_table заставит их указывать на old_users_authlogic.

0

Я решил эту проблему путем удаления Придумайте миграции файл, но не удаляя его из Sublime. Затем я сделал rails g migration remove_email_from_foo, тем самым удалив атрибут электронной почты. Затем я отменил файл удаления удаления Devise, который купил файл миграции обратно в &, запустив rake db: migrate. Придумайте атрибуты, сохраненные в модели

Смежные вопросы