remove_column не удаляет столбец или не дает ошибок в рельсах - PullRequest
5 голосов
/ 17 августа 2010

У меня есть sqlite3 db в приложении rails со следующей схемой

ActiveRecord::Schema.define(:version => 20100816231714) do

  create_table "comments", :force => true do |t|
    t.string   "commenter"
    t.text     "body"
    t.integer  "post_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "posts", :force => true do |t|
    t.string   "name"
    t.string   "title"
    t.text     "content"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "tags", :force => true do |t|
    t.string   "name"
    t.integer  "post_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end

Я начал с отношения Post: has_many с тегами, поэтому каждый тег имеет ссылку на post_id.

Теперь я хочу изменить это отношение на has_and_belongs_to_many, я знаю, что мне нужно создать таблицу соединений и т. Д. .... это не проблема и работает

Проблема возникает, когда я пытаюсь удалить post_id из таблицы тегов. Моя миграция выглядит так:

class RemoveFieldsToTags < ActiveRecord::Migration
   def self.up
     remove_column :tags, :post_id
   end

   def self.down
     add_column :tags, :post_id, :references
   end
 end

Когда я запускаю rake db: migrate и rake db: migrate: up VERSION = Ничего не происходит, когда я запускаю rake db: migrate: down VERSION = Я получаю столбец:

SQLite3::SQLException: duplicate column name: post_id: ALTER TABLE "tags" ADD "post_id" references

Кто-нибудь знает, что происходит?

Ответы [ 3 ]

5 голосов
/ 17 августа 2010

Звучит так, как будто Rails думает, что ваша БД обновлена ​​(учитывая, что при запуске db: migrate ничего не происходит).Вы можете войти в это состояние, если вы изменили свою миграцию после ее применения (обычно во время разработки).

Вы пробовали запустить db: migrate на новой базе данных (обратите внимание, это уничтожит вашу базу данных)?

rake db:drop db:create db:migrate
4 голосов
/ 17 августа 2010

Как упомянуто выше в avaynshtok, похоже, что rails думает, что ваши миграции актуальны (как, например, все они применены), но для вас это не так (столбец post_id все еще находится в таблице тегов).

Обычный «обходной путь» для решения этой ситуации без необходимости очистки вашей базы данных - это комментирование «down» метода вашей миграции и запуска

rake db:migrate:redo

Учитывая, что «down» закомментирован, он не будет пытаться добавить столбец снова, поэтому он продолжит повторное применение метода «up», удаляя столбец «post_id».Затем вы можете удалить комментарий к методу down, и все должно быть хорошо.

PS.Возможно, вы захотите использовать отношения типа «has_many: through» вместо «has_and_belongs_to_many».

0 голосов
/ 14 марта 2012

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

rake db: create db: migrate


rake db: migrate: redo

и

rake db: drop

у меня не сработало, как говорилось"db / test.sqlite3 уже существует".

...