rails migraciones ejecutar mysql ruby-on-rails migration

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 ".

  1. Tipo rails g migration AddGenderToUser gender:string
  2. 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



Esto ahora es posible en Rails 2.3.6+ pasando el parámetro: after

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

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.