Разработать миграцию на существующей модели - PullRequest
9 голосов
/ 14 ноября 2010

Я мигрирую из Authlogic в Devise.

ОБНОВЛЕНО:

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

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

Это ошибка, которую я получаю при запуске 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"

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

Спасибо!

Ответы [ 4 ]

22 голосов
/ 22 ноября 2010

Ошибка, которую вы получаете, заключается в том, что вы пытаетесь воссоздать поле email, которое у вас уже есть.Поле email создается в помощнике разработчика t.database_authenticatable.Вы можете использовать свою старую таблицу пользователей с новой системой, но вам не нужно включать t.database_authenticatable, вам просто нужно переименовать ваши старые имена полей.Посмотрев документацию для Devise , вы увидите, что database_authenticatable просто создает три поля: электронная почта, encrypted_password и password_salt.Они совпадают с электронной почтой, crypted_password и password_salt, которые у вас уже есть в вашей таблице authlogic user, поэтому вы можете использовать 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
4 голосов
/ 14 ноября 2010

Вместо изменения 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 голосов
/ 15 мая 2015

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

0 голосов
/ 14 ноября 2010
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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...