Проблема миграции в Ruby-on-rails - PullRequest
1 голос
/ 30 августа 2010

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

Итак, я удалил пользователей таблицы из postgres и добавил новый столбец в первый раз.Миграция ruby ​​class:

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

Итак, при повторном запуске db: migrate hopping будет создана новая пользовательская таблица с новым атрибутом: authorization_token, она не работает, но без ошибок.

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

Ответы [ 2 ]

3 голосов
/ 30 августа 2010

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

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

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

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

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

2 голосов
/ 30 августа 2010

Миграции запускаются один раз и сохраняются в базе данных как использовавшиеся (см. Таблицу 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

...