Как удалить столбцы с помощью миграции Rails - PullRequest
573 голосов
/ 14 мая 2010

Каков синтаксис для отбрасывания столбца таблицы базы данных через миграцию Rails?

Ответы [ 18 ]

843 голосов
/ 03 июня 2010
remove_column :table_name, :column_name

Например:

remove_column :users, :hobby

удалит колонку хобби из таблицы пользователей.

354 голосов
/ 18 сентября 2010

Для более старых версий Rails

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Для Rails 3 и выше

rails generate migration RemoveFieldNameFromTableName field_name:datatype
112 голосов
/ 22 июля 2013

Rails 4 был обновлен, поэтому метод переноса может использоваться для переноса столбца, и перенос будет успешно откатан. Пожалуйста, прочтите следующее предупреждение для приложений Rails 3:

Рельсы 3 Предупреждение

Обратите внимание, что при использовании этой команды:

rails generate migration RemoveFieldNameFromTableName field_name:datatype

Сгенерированная миграция будет выглядеть примерно так:

  def up
    remove_column :table_name, :field_name
  end

  def down
    add_column :table_name, :field_name, :datatype
  end

Убедитесь, что не используете метод change при удалении столбцов из таблицы базы данных (пример того, что вам не нужно в файле миграции в приложениях Rails 3):

  def change
    remove_column :table_name, :field_name
  end

Метод изменения в Rails 3 не слишком умен, когда дело доходит до remove_column, поэтому вы не сможете откатить эту миграцию.

35 голосов
/ 10 июля 2014

В приложении rails4 можно использовать метод change также для удаления столбцов. Третий параметр - это data_type, а в необязательном разделе вы можете указать параметры. Это немного скрыто в разделе «Доступные преобразования» в документации .

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end
22 голосов
/ 09 апреля 2014

Есть два хороших способа сделать это:

remove_column

Вы можете просто использовать remove_column, например, так:

remove_column :users, :first_name

Это нормально, если вам нужно всего лишь внести одно изменение в вашу схему.

блок change_table

Вы также можете сделать это, используя блок change_table, например:

change_table :users do |t|
  t.remove :first_name
end

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

Вот полный список поддерживаемых методов change_table:

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table

13 голосов
/ 24 августа 2016

в рельсах 5 вы можете использовать эту команду в терминале:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

например, чтобы удалить столбец access_level (строка) из таблицы пользователей:

rails generate migration remove_access_level_from_users access_level:string

и затем запустите:

rake db:migrate
11 голосов
/ 30 сентября 2016

Удалить столбцы для приложения RAILS 5

rails g migration Remove<Anything>From<TableName> [columnName:type]

Команда выше генерирует файл миграции в каталоге db/migrate. Удар фрагмента - это один из столбцов удаления из таблицы, сгенерированный генератором Rails,

class RemoveAgeFromUsers < ActiveRecord::Migration
  def up
    remove_column :users, :age
  end
  def down
    add_column :users, :age, :integer
  end
end

Я также сделал краткое справочное руководство по Rails, которое можно найти по адресу здесь .

10 голосов
/ 06 апреля 2013
rails g migration RemoveXColumnFromY column_name:data_type

X = имя столбца
Y = имя таблицы

EDIT

Изменено RemoveXColumnToY на RemoveXColumnFromY согласно комментариям - обеспечивает большую ясность в том, что на самом деле делает миграция.

10 голосов
/ 14 мая 2010

Вы можете попробовать следующее:

remove_column :table_name, :column_name

( Официальная документация )

8 голосов
/ 15 ноября 2017

Создайте миграцию для удаления столбца таким образом, чтобы при переносе (rake db:migrate) он отбрасывал столбец . И он должен добавить столбец обратно , если откат переносится (rake db:rollback).

Синтаксис:

remove_column: имя таблицы,: имя столбца,: тип

Удаляет столбец, также добавляет столбец обратно , если миграция откатывается.

Пример:

remove_column :users, :last_name, :string

Примечание : Если вы пропустите тип данных , миграция удалит столбец успешно, но если вы откатите миграцию, она выдаст ошибку.

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