rails migrations generate foreign column active ruby-on-rails ruby-on-rails-3 activerecord rails-activerecord database-indexes

ruby-on-rails - migrations - rails generate migration



¿Renombrar_columna se ocupa de los índices? (1)

Diga, tenemos algo como esto:

add_column :users, :single, :boolean add_index :users, :single

y luego lo hacemos

rename_column :users, :single, :married

¿Actuará ActiveRecord y / o la base de datos el cambio de nombre del índice o tendré que soltar manualmente el índice y volverlo a agregar?


Para PostgreSQL, rename_column se implementa como una ALTER TABLE ... RENAME COLUMN ... simple ALTER TABLE ... RENAME COLUMN ... y eso conserva los índices.

Las versiones de MySQL (las dos) hacen ALTER TABLE ... CHANGE ... y eso también preserva los índices.

La versión SQLite parece copiar toda la tabla (con índices), descartar la anterior y luego copiar la copia al nombre original de la tabla. La copia parece manejar el cambio de nombre de la columna al copiar los índices:

def copy_table(from, to, options = {}) #... copy_table_indexes(from, to, options[:rename] || {})

y dentro de copy_table_indexes :

columns = index.columns.map {|c| rename[c] || c }.select do |column| to_column_names.include?(column) end

Por lo tanto, los controladores estándar conservarán sus índices cuando haga un rename_column y el controlador SQLite hará algún esfuerzo para hacerlo.

La documentación API no especifica ningún comportamiento en particular, por lo que otros controladores pueden hacer otras cosas. Lo más cerca que está la documentación de decir algo acerca de los índices es esto en active_record/migration.rb :

rename_column(table_name, column_name, new_column_name) : rename_column(table_name, column_name, new_column_name) una columna, pero conserva el tipo y el contenido.

Creo que cualquier controlador preservaría los índices, pero no hay garantía; un escritor de controladores sin duda sería tonto no preservar los índices.

Esta no es una respuesta definitiva o autorizada, pero sus índices deben conservarse si utiliza el estándar PostgreSQL, MySQL (cualquiera de ellos) o controladores SQLite.

Tenga en cuenta que, aunque el índice en sí sobreviva al cambio de nombre de la columna, no hay garantía de que se cambie el nombre del índice. Esto no debería ser un problema a menos que esté haciendo algo (como dejarlo caer manualmente) que se preocupe por el nombre del índice en lugar de las columnas involucradas.

El comportamiento anterior cambió en Rails 4 :

  • En Rails 4.0 cuando se renombra una columna o una tabla, los índices relacionados también se renombran. Si tiene migraciones que renombran los índices, ya no son necesarios.

Por lo tanto, ActiveRecord cambiará el nombre de los índices automáticamente para que coincidan con los nuevos nombres de tabla o columna cuando cambie el nombre de la tabla o columna. Gracias a sequielo por el cara a cara en esto.