Изменить схему в Rails 2

Мне нужно добавить несколько столбцов в таблицу в моей схеме. Может ли кто-нибудь сказать мне, как лучше всего это сделать?

Следующее кажется неполным или неправильным, поскольку файл schema.rb не был обновлен для включения нового столбца, а все соответствующие файлы представления (edit, index, new, show) не были обновлены для включения нового столбца. Не говоря уже о раздувании всех тех классов миграции, которые создаются. Спасибо

ruby script/generate migration RecordLabelToAlbums record_label:string
      exists  db/migrate
      create  db/migrate/20121130125859_record_label_to_albums.rb

Создает это:

class RecordLabelToAlbums < ActiveRecord::Migration
def self.up
end

def self.down
 end
end

Затем я добавил это:

class RecordLabelToAlbums < ActiveRecord::Migration
def self.up
   add_column :albums, :record_label, :text
end

def self.down
   remove_column :albums, :record_label
end

end

Я побежал:

rake db:migrate

Получил это: Mysql:: Ошибка: таблица «альбомы» уже существует: CREATE TABLE albums (id int (11) DEFAULT NULL auto_increment PRIMARY KEY, created_at datetime, updated_at datetime)


person Slinky    schedule 30.11.2012    source источник
comment
Вы выполняли миграцию с помощью rake db:migrate? Вам нужно будет изменить код приложения самостоятельно.   -  person Chowlett    schedule 30.11.2012
comment
Да, когда я начинал разработку, я запускал rake db:migrate. Теперь мне нужно добавить несколько столбцов в таблицу, и мне было любопытно, как это сделать лучше всего.   -  person Slinky    schedule 30.11.2012


Ответы (1)


Код, который вы добавили, правильный.

Ошибка предполагает, что по какой-то причине ваша система считает, что она еще не выполнила исходную миграцию, которая создала таблицу альбомов. Состояние миграций (в Rails 2) указано в таблице в базе данных с именем schema_migrations — если это запутается, то она попытается повторно запустить миграции. Я не уверен, что может привести к путанице, но я помню, что это случалось пару раз в 2008 году, когда я использовал Rails 2.x.

Таблица проста — вы можете увидеть, что в ней, из подсказки SQL — просто имена миграций, которые, по-моему, она выполнила.

Если вы не возражаете против потери некоторых данных, вы можете попробовать rake db:rollback или даже rake db:reset, чтобы вернуться к началу. rake db:rollback STEP=2 откатит последние 2 миграции.

Если вам нужны данные, исправьте содержимое таблицы, добавив одну или несколько новых записей, ссылающихся на миграции в app/db/migrations, которые могли быть пропущены. Думаю, порядок важен (в Rails 3 формат немного изменился, не помню как).

В любое время, когда вы захотите добавить или изменить схему базы данных, используйте rails для создания миграции, а затем запустите rake db:migrate, как только она будет готова к работе.

И просто спрашиваю: можно ли как-нибудь перейти на Rails 3. Он существует уже несколько лет, и скоро появится Rails 4. Вы окажетесь в болоте несовместимости, устаревания, проблем с безопасностью и производительностью и т. д., если вы не примете удар и не обновитесь.

person Tom Harrison    schedule 30.11.2012
comment
Спасибо, Том, за подробное объяснение. Мне достался этот проект, который время от времени нужно обновлять. Есть ли хорошее руководство по переходу с Rails 2 на 3? Ваше здоровье - person Slinky; 30.11.2012
comment
Есть тонны. Google переходит с рельсов 2 на 3 — RailsCast хороши, и похоже, что есть жемчужина, которая поможет вам понять, что, возможно, нужно переместить. (Небольшое разглагольствование: многие приложения остаются в описанном вами состоянии. Когда ресурсы не выделяются для поддержания приложения в актуальном состоянии, различные проблемы безопасности и другие проблемы остаются нерешенными. Это действительно обязанность компании — оставаться относительно актуальным.) Хорошо, теперь, когда я избавился от этого, я чувствую себя лучше :-) - person Tom Harrison; 30.11.2012