Есть ли способ контролировать порядок столбцов в миграциях ActiveRecord? - PullRequest
1 голос
/ 04 июня 2009

Я хотел бы добавить столбец в таблицу, используя миграцию. Есть ли способ добавить его в определенную позицию, а не в качестве последнего столбца? Я мог найти любую опцию «заказать» в документации API.

Ответы [ 2 ]

3 голосов
/ 05 июня 2009

Действительно, это не является частью API миграции, но если вы хотите отказаться от нейтральности в отношении поставщиков (и ваша БД поддерживает это), это, вероятно, довольно легко реализовать.

Если вы используете MySQL, вот обезьяна-патч для MysqlAdapter, которая добавит опции: after и: first to add_column и change_column. ( См. Здесь для соответствующего синтаксиса MySQL ALTER TABLE .)

ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
  def add_column_options!(sql, options)
    super
    if options[:after]
      sql << " AFTER #{quote_column_name(options[:after])}"
    elsif options[:first]
      sql << " FIRST"
    end
  end
end

Так что теперь

a.add_column :foos, :bar, :string, :null => false, :limit => 20, :after => "baz"

выполнит

ALTER TABLE `foos` ADD `bar` varchar(20) NOT NULL AFTER `baz`

и

a.add_column :foos, :bar, :string, :null => false, :limit => 20, :first => true

выполнит

ALTER TABLE `foos` ADD `bar` varchar(20) NOT NULL FIRST

Аналогично для change_column.

2 голосов
/ 04 июня 2009

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

Если ваша БД поддерживает ее, и вы не хотите поддерживать несколько баз данных, вы можете использовать оператор execute непосредственно в вашей миграции.

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