Можете ли вы указать в Rails Migration (MySQL), какую позицию должен занять новый столбец? - PullRequest
52 голосов
/ 16 декабря 2008

Если я добавляю столбец через MySQL, я могу указать, где в таблице этот столбец будет использовать модификатор AFTER. Но если я сделаю add_column через миграцию Rails, столбец будет создан в конце таблицы.

Есть ли какая-либо функциональность для миграции рельсов для указания позиции добавляемого столбца?

Ответы [ 5 ]

59 голосов
/ 15 июля 2010

Теперь это возможно в Rails 2.3.6+, передавая параметр: after

https://rails.lighthouseapp.com/projects/8994/tickets/3286-patch-add-support-for-mysql-column-positioning-to-migrations

Всем, кто не видит преимущества этой функции: вы никогда не просматривали свою базу данных вне ORM? Если я просматриваю какой-либо пользовательский интерфейс, мне нравятся сгруппированные вместе внешние ключи, столбцы состояния, флаги и т. Д. Это не влияет на приложение, но определенно ускоряет мою способность просматривать данные.

23 голосов
/ 30 марта 2012

Конечно, вы можете.

  • Краткий ответ:

    add_column :users, :gender, :string, :after => :column_name
    
  • Длинный ответ:

Вот пример, скажем, вы хотите добавить столбец с именем " пол " после столбца " имя пользователя " в таблицу " users ".

  1. Тип rails g migration AddGenderToUser gender:string
  2. Добавить " after =>: username " в миграцию, которая была создана, чтобы это выглядело так:

    class AddSlugToDictionary < ActiveRecord::Migration
      def change
        add_column :users, :gender, :string, :after => :username
      end
    end
    
8 голосов
/ 05 октября 2009

Я создал патч, который добавляет эту дополнительную функциональность к адаптеру ActiveRecord Mysql. Работает на мастера и на 2-3 стабильных.

https://rails.lighthouseapp.com/projects/8994/tickets/3286-patch-add-support-for-mysql-column-positioning-to-migrations

Это может быть специфично для mysql, но это не делает ваши миграции менее переносимыми (другие адаптеры просто игнорируют дополнительные параметры позиционирования).

5 голосов
/ 16 декабря 2008

Похоже, что нет опции позиции для метода add_column в миграциях. Но миграции поддерживают выполнение буквального SQL. Я не являюсь разработчиком Rails, но что-то вроде следующего:

class AddColumnAfterOtherColumn < ActiveRecord::Migration
  def self.up
    execute "ALTER TABLE table_name ADD COLUMN column_name INTEGER 
      AFTER other_column"
  end

  def self.down
    remove_column :table_name, :column_name
  end
end
1 голос
/ 16 декабря 2008

В Rails нет способа указать положение столбца. На самом деле, я думаю, что только случайно (и, следовательно, не следует полагаться), столбцы создаются в том порядке, в котором они названы в миграции.

Порядок столбцов в таблице почти уместен и должен быть таким: общая «причина», указанная для того, чтобы иметь возможность видеть определенное подмножество при выполнении «SELECT *», но это действительно не очень хорошая причина.

Любая другая причина - это, вероятно, запах дизайна, но я бы хотел узнать вескую причину, по которой я ошибаюсь!

На некоторых платформах существует (минимальное) пространство и экономия производительности, которые можно получить, поместив столбцы с наибольшей вероятностью NULL в конец (поскольку DMBS не будет использовать дисковое пространство для "конечных" значений NULL , но я думаю, что вам придется работать на оборудовании 1980-х годов, чтобы заметить.

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