Добавление столбца в существующую таблицу в миграции Rails - PullRequest
295 голосов
/ 29 января 2011

У меня есть модель Users, которой нужен столбец :email (я забыл добавить этот столбец во время первоначальной сборки).

Я открыл файл миграции и добавил t.string :email, сделал rake db:migrate и получил NoMethodError.Затем я добавил строку

add_column :users, :email, :string

снова rake db:migrate, снова NoMethodError.Я пропустил здесь шаг?

Редактировать: вот файл миграции.

class CreateUsers < ActiveRecord::Migration  
  def self.up  
    add_column :users, :email, :string  
    create_table :users do |t|  
      t.string :username  
      t.string :email  
      t.string :crypted_password  
      t.string :password_salt  
      t.string :persistence_token  

      t.timestamps  
    end  
  end  

  def self.down  
    drop_table :users  
  end  
end

Ответы [ 9 ]

518 голосов
/ 29 января 2011

Если вы уже запустили исходную миграцию (до ее редактирования), вам нужно сгенерировать новую миграцию (rails generate migration add_email_to_users email:string поможет). Затем выполните rake db:migrate, и он запустит новую миграцию.

Если вы еще не запустили оригинальную миграцию, вы можете просто отредактировать ее, как пытаетесь это сделать. Ваш код миграции почти идеален: вам просто нужно полностью удалить строку add_column (этот код пытается добавить столбец в таблицу до ее создания, и ваш код для создания уже обновлен и теперь включает t.string :email).

102 голосов
/ 15 апреля 2014

Используйте эту команду на консоли rails

rails generate migration add_fieldname_to_tablename fieldname:string

и

rake db:migrate

для запуска этой миграции

30 голосов
/ 03 февраля 2018

Иногда rails generate migration add_email_to_users email:string производит миграцию, подобную этой

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
  end
end

В этом случае вам нужно вручную add_column до change:

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :email, :string
  end
end

А потом запустить rake db:migrate

22 голосов
/ 17 октября 2013

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

rake db:rollback

, если вы не добавили никаких данных в таблицы. Затем отредактируйте файл миграции, добавив в него столбец электронной почты, а затем вызовите

rake db:migrate

Это будет работать, если в вашей системе установлены rails 3.1 и выше.

Гораздо более простой способ сделать это - изменить изменение файла миграции таким, какое оно есть. использовать

$rake db:migrate:redo

Это откатит последнюю миграцию и перенастроит ее снова.

18 голосов
/ 07 июля 2016

Чтобы добавить столбец, мне просто нужно было выполнить следующие шаги:

  1. rails generate migration add_fieldname_to_tablename fieldname:string

    Альтернативные

    rails generate migration addFieldnameToTablename

    Как только миграция будет сгенерирована, отредактируйте миграцию и определите все атрибуты, которые вы хотите добавить в этот столбец.

    Примечание : имена таблиц в Rails всегда множественные (для соответствия соглашениям БД). Пример использования одного из шагов, упомянутых ранее -

    rails generate migration addEmailToUsers

  2. rake db:migrate

или

  1. Вы можете изменить схему с db/schema.rb, Добавить нужные столбцы в запросе SQL.
  2. Запустите эту команду: rake db:schema:load

    Внимание / Note

    Имейте в виду, что при запуске rake db:schema:load автоматически стираются все данные в ваших таблицах.

3 голосов
/ 29 января 2011

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

Вы можете изменитьоригинал и повторите его, если вы переходите между ними, но в этом случае я думаю, что это сделало миграцию, которая не будет работать должным образом.1005 *

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

1 голос
/ 11 апреля 2017

Вы также можете принудительно заставить столбцы таблицы в таблице, используя force: true, если ваша таблица уже существует.

пример

ActiveRecord::Schema.define(version: 20080906171750) do
  create_table "authors", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end
0 голосов
/ 04 апреля 2017

Вы также можете сделать это .. rails gigration add_column_to_users email: строка

затем rake db: migrate также добавить: атрибут email в вашем пользовательском контроллере;

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

0 голосов
/ 20 марта 2017

Вы можете откатить последнюю миграцию с помощью

rake db:rollback STEP=1

или откатить эту специфическую миграцию с помощью

rake db:migrate:down VERSION=<YYYYMMDDHHMMSS>

и отредактировать файл, а затем запустить rake db:mirgateеще раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...