2010-08-29 3 views
1

Эй, ребята, когда я впервые начал проект рельсов, пользователь модели был спроектирован и создан. После всей части миграции он успешно создал таблицу «users» в postgres. Ну, тогда после выполнения некоторых изменений во время проекта я понял, что в таблице отсутствует столбец атрибута/нового столбца.Проблема миграции в Ruby-on-rails

Так что я сделал удалить пользователей таблицы из Postgres и добавить новый столбец в моем первом классе миграции рубина:

class CreateUsers < ActiveRecord::Migration 
    def self.up 
    create_table :users do |t| 
     t.string :name 
     t.string :password 
     t.string :email 
     t.string :authorization_token //this is the new attribute that I insert 
     t.datetime :created_at 
     t.datetime :updated_at 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :users 
    end 
end 

Итак, когда я бегу снова ДБ: мигрировать скачкообразной, что новая пользовательская таблица будет создан с новым атрибутом: authorization_token, он не работает, но без ошибок.

(я знаю, что я не должен удалить таблицу, есть еще один умный способ сделать это)

ответ

2

Миграции выполняются один раз & хранятся в базе данных как будто они были использованы (посмотрите в таблицу schema_migrations) , Вы можете попробовать использовать rake db: migrate: reset, чтобы повторно запустить начальную миграцию, но лучше просто добавить новые миграции (вы не захотите сбрасывать свою базу данных, когда у нее есть данные) следующим образом:

сценарий/генерировать миграции add_authorization_token_to_users authorization_token: струнные

, который будет генерировать нечто похожее на следующее:

class AddAuthorizationTokenToUsers < ActiveRecord::Migration 
    def self.up 
    change_table :users do |t| 
     t.string :authorization_token //this is the new attribute that I insert 
    end 
    end 

    def self.down 
    remove_column :users, :authorization_token 
    end 
end 

чтобы увидеть, как добавить/удалить столбец, change_table и т.д. работа, посмотрите на ActiveRecord :: ConnectionAdapters :: SchemaStatements по адресу: http://api.rubyonrails.org или http://guides.rubyonrails.org/migrations.html

3

Совет для работы с Rails - не изменяйте свои таблицы с помощью SQL. Когда вы увидели проблему, вы должны написать новую миграцию, такую ​​как @nruth. Выполнение команды rake: migrate отлично справилось бы.

В этом случае, поскольку вы уже удалили свою таблицу «пользователей», теперь у вас возникла проблема с тем, что ваша схема базы данных не синхронизирована с тем, что, по мнению Rails. Чтобы устранить эту проблему, вы можете либо привести схему базы данных примерно к тому, что Rails считает, что она вручную создает таблицу «users», запуская вниз миграцию, а затем вверх. Или вы можете получить Rails до скорости с тем фактом, что таблица «пользователей» больше не существует. Rails сохраняет информацию о миграции в таблице schema_info (Rails < 2.1) или в таблице schema_migrations (Rails> = 2.1). Если вы удалите эту таблицу, Rails будет считать, что схема не существует, и попытайтесь запустить все миграции вверх и снова заново создать таблицу пользователей.

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

class CreateBaselineUsers < ActiveRecord::Migration 
    def self.up 
    create_table :users, :force => true do |t| 
     t.string :name 
     ... 

Это будет принудительно удалить таблицу и воссоздать его со всеми атрибутами, которые вы хотите.

+0

спасибо, я сделал то, что вы сказали и работал :) – mateusmaso

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