migraciones - mysql en ruby on rails
En una migración de Rails(MySQL), ¿puede especificar qué posición debe tener una nueva columna? (5)
Seguro que puede.
Respuesta corta:
add_column :users, :gender, :string, **:after => :column_name**
Respuesta larga:
Aquí hay un ejemplo, digamos que desea agregar una columna llamada " género " después de la columna " nombre de usuario " a la tabla " usuarios ".
- Tipo
rails g migration AddGenderToUser gender:string
Agregue " after =>: username " en la migración que se creó para que se vea así:
class AddSlugToDictionary < ActiveRecord::Migration def change add_column :users, :gender, :string, :after => :username end end
Si agrego una columna a través de MySQL, puedo especificar en qué parte de la tabla esa columna usará el modificador AFTER. Pero si hago add_column a través de una migración de Rails, la columna se creará al final de la tabla.
¿Hay alguna funcionalidad para migraciones de rieles para especificar la posición de una columna agregada?
No hay forma de que Rails especifique la posición de una columna. De hecho, creo que es solo una coincidencia (y por lo tanto no se puede confiar en) que las columnas se crean en el orden en que se nombran en una migración.
El orden de las columnas dentro de una tabla es casi relevante y debería serlo: la "razón" común que se da es poder ver un subconjunto particular cuando se ejecuta un "SELECCIONAR *", pero esa no es realmente una buena razón.
Cualquier otra razón es probablemente un olor de diseño, pero me encantaría saber una razón válida por la que estoy equivocado.
En algunas plataformas, se obtiene un espacio (minúsculo) y un ahorro de rendimiento al colocar las columnas con la mayor probabilidad de ser NULL hasta el final (porque el DMBS no usará ningún espacio en disco para valores NULL "finales", pero Creo que tendrías que correr en el hardware de 1980 para darte cuenta.
No parece haber una opción de posición para el método add_column
en las migraciones. Pero las migraciones admiten la ejecución de SQL literal. No soy desarrollador de Rails, pero algo como lo siguiente:
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
Creé un parche que agrega esta funcionalidad adicional al adaptador ActiveRecord Mysql. Funciona para master y 2-3-stable.
Puede ser específico de mysql, pero no hace que sus migraciones sean menos portátiles (otros adaptadores simplemente ignorarían las opciones de posicionamiento adicionales).
Esto ahora es posible en Rails 2.3.6+ pasando el parámetro: after
Para todos los que no ven la ventaja de tener esta característica: ¿nunca miran su base de datos fuera del ORM? Si estoy viendo en cualquier tipo de interfaz de usuario, me gusta tener cosas como claves externas, columnas de estado, banderas, etc., todos agrupados. Esto no afecta la aplicación, pero definitivamente acelera mi capacidad de revisar datos.