2008-12-16 17 views

Respuesta

57

Esto es ahora posible en Rieles 2.3.6+ pasando el: después de parámetro

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

Para todos los que no ve la ventaja de tener esta característica: qué nunca mira a 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.

+0

Nueva característica muy genial. – yalestar

+1

Gracias por dar una razón válida para preocuparse por el orden de las columnas. Realmente no lo entendí hasta que leí tu respuesta. Si miro la base de datos fuera del ORM, eso generalmente significa la consola de la línea de comandos de SQL o una interfaz de usuario donde puedo mezclar las columnas como me gusta. No pensé en estas cosas nuevas de UI web. :-) – clacke

+0

¿Alguna idea si SQLite admite: después de la opción? No se puede hacer funcionar en ni change_column ni add_column – alexy2k

5

No parece haber una opción de posición para el método add_column en migraciones. Pero las migraciones admiten la ejecución de SQL literal. No soy un 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 
+0

Sí, esto es lo que hago para mi aplicación que utiliza y una versión anterior de los rieles. – Vicer

1

No hay manera dentro de los carriles para especificar 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 debe serlo: el "motivo" común es poder ver un subconjunto particular al ejecutar un "SELECT *", pero esa no es 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, hay un espacio (minúsculo) y ahorro de rendimiento que se obtiene colocando las columnas con la mayor probabilidad de ser NULL hasta el final (porque el DMBS no usará ningún espacio en disco para "seguir" NULL valores, pero creo que tendría que estar en ejecución en el hardware de 1980 para darse cuenta.

+0

No es una coincidencia, es el comportamiento estándar de SQL que ALTER TABLE ADD COLUMN agregue la columna como la última posición ordinal en la tabla. La sintaxis "AFTER" de MySQL es una extensión del SQL estándar. –

+0

ANSI estándar? ¿O de facto? No bromeando, solo curiosidad. –

+0

Me estoy refiriendo al libro "SQL-99 Complete, Really", que describe como comportamiento estándar ANSI que se agregan columnas adicionales como la columna más a la derecha en una tabla. –

17

Claro que sí.

  • Respuesta corta:

    add_column :users, :gender, :string, **:after => :column_name** 
    
  • Respuesta larga:

Aquí es un ejemplo, digamos que usted desea agregar una columna llamada "género" después de la columna " nombre de usuario "a" usuarios "tabla.

  1. Tipo rails g migration AddGenderToUser gender:string
  2. Agregar "después =>: Nombre de usuario" en la migración que se ha creado por lo que se ve así:

    class AddSlugToDictionary < ActiveRecord::Migration 
        def change 
        add_column :users, :gender, :string, :after => :username 
        end 
    end 
    
+0

¿Podría agregar un enlace a la documentación oficial? – sekmo

Cuestiones relacionadas