В Rails Migration (MySQL) вы можете указать, в какой позиции должен стоять новый столбец?
Если я добавляю столбец через MySQL, я могу указать, где в таблице этот столбец будет использовать модификатор AFTER. Но если я сделаю add_column через миграцию Rails, столбец будет создан в конце таблицы.
Есть ли какая-либо функция для переходов rails, чтобы указать позицию добавленного столбца?
Ответы
Ответ 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
Что вы можете.
Вот пример, допустим, вы хотите добавить столбец с именем " пол " после столбца " имя пользователя " в таблицу " пользователи ".
- Тип
rails g migration AddGenderToUser gender:string
-
Добавьте " 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 года, чтобы заметить.