Подтвердить что ты не робот

Ruby on Rails: добавление столбцов в существующую базу данных

Я получаю сообщение об ошибке:

SQLite3::SQLException: no such column: ideas.list_id: 
SELECT "ideas".* FROM "ideas"  
WHERE "ideas"."list_id" = 2

Но я добавил

t.integer :list_id

в файл миграции db:

class CreateIdeas < ActiveRecord::Migration
  def change
    create_table :ideas do |t|
      t.string :name
      t.text :description
      t.string :picture

      t.timestamps
    end
    add_foreign_key :ideas, :lists
  end
end

который дал мне это:

class CreateIdeas < ActiveRecord::Migration
  def change
    create_table :ideas do |t|
      t.string :name
      t.text :description
      t.string :picture
      t.integer :list_id
      t.timestamps
    end
    add_foreign_key :ideas, :lists
  end
end

а затем я набрал

rake db:migrate

Любая идея, почему я получаю ошибку, говоря, что нет колонки? Я все еще новичок в RoR. Нужно ли добавлять столбец другим способом?

Спасибо

4b9b3361

Ответ 1

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

rails generate migration AddListIdColumnToIdeas list_id:integer

И Rails автоматически сгенерирует файл миграции, и осталось только run rake db:migrate.

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

rake db:drop
rake db:create
rake db:migrate

Что разрушит вашу текущую базу данных, создаст новую и запустит все миграции (в которую войдет ваш новый столбец).

Ответ 2

Если вы хотите добавить новый столбец в существующую базу данных, вы должны использовать rails generate migration. Поэтому вы можете попробовать rails generate migration add_list_id_to_ideas list_id:integer, а затем использовать rake db:migrate для фиксации этого изменения.

Ответ 3

Нельзя добавлять новые строки в старые миграции. Миграция - это шаг построения базы данных. И число последней выполненной миграции хранится в schema, и она не будет запущена или переделана, если вы используете, будет использовать rake db:migrate. Если вы запустите миграцию с созданием таблицы раньше, вам следует создать новую миграцию, где вы можете использовать метод add_column.

Ответ 4

имя файла миграции имеет datetime, закодированное в его имени, поэтому рельсы запускают этот перенос и не запускают его снова, если вы не выполняете откаты

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

и запомните

удалите добавленную строку из старого файла миграции, поскольку это может вызвать ошибки, если вы решили отменить эту миграцию

Ответ 6

Если у вас уже есть файлы в папке переноса, вы можете просто добавить туда столбец (просто введите код), удалите файл development.sqlite или что-то, что представляет ваш файл db, и запустите rake db: migrate. Затем он создаст новый sqlite файл с новым столбцом в таблице, и вы можете проверить его в schema.rb

Итак, в основном, все, что вы делали, кажется хорошим, за исключением того, что вы не удаляли свой файл базы данных. Выполнение этого кажется самым легким для меня, все, хотя вы потеряете все файлы в своей базе данных. Если вы просто тестируете и разрабатываете приложение Rails, это работает. Может кто-нибудь прокомментировать, если что-то не так с этим подходом, кроме того, что я написал?

Изменить: я действительно нашел ответ об этом здесь Редактирование существующих Rails Migrations - хорошая идея?

Ответ 7

Вы также можете сделать это.

rails g migration add_column_to_users list_id: string

затем rake db: migrate

также добавить в свой пользовательский контроллер атрибут list_id;

для более подробной информации http://guides.rubyonrails.org/active_record_migrations.html