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

В Rails Migration (MySQL) вы можете указать, в какой позиции должен стоять новый столбец?

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

Есть ли какая-либо функция для переходов rails, чтобы указать позицию добавленного столбца?

4b9b3361

Ответ 1

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

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

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

Ответ 2

Что вы можете.

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

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

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

  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
    

Ответ 3

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

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

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

Ответ 4

По-видимому, для методов 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

Ответ 5

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

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

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

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