2009-09-19 18 views

Respuesta

551

La respuesta corta:

add_index :table_name, :column_name, unique: true 

indizar varias columnas juntas, se pasa una matriz de nombres de columna en lugar de un solo nombre de columna,

add_index :table_name, [:column_name_a, :column_name_b], unique: true 

Para grano más fino de control, hay un " execute "método que ejecuta SQL directo.

Eso es todo!

Si está haciendo esto como reemplazo de las validaciones normales del modelo antiguo, simplemente verifique cómo funciona. No estoy seguro de que el informe de error al usuario sea tan bueno. Siempre puedes hacer ambas cosas.

+33

+1 para sugerir que se continúe usando validates_uniqueness_of. El manejo de errores es mucho más limpio usando este método para el costo de una única consulta indexada. Yo sugeriría que hace ambas cosas. –

+1

¡Intenté que no funcionara! ¡Podría insertar dos registros con el column_name que definí como único! Estoy usando Rails 2.3.4 y MySql alguna idea? – Tam

+0

Utilicé la segunda sugerencia usando ejecutar: ejecutar "ALTER TABLE users ADD UNIQUE (email)" ¡y funciona! No estoy seguro de por qué el primero no estaría interesado en saber – Tam

97

carriles generan migración add_index_to_table_name COLUMN_NAME: uniq

o

carriles generan migración add_column_name_to_table_name COLUMN_NAME: cadena: uniq: Índice

genera

class AddIndexToModerators < ActiveRecord::Migration 
    def change 
    add_column :moderators, :username, :string 
    add_index :moderators, :username, unique: true 
    end 
end 

Si va a añadir un índice para una columna existente, elimine o comente la línea add_column, o poner en un cheque

add_column :moderators, :username, :string unless column_exists? :moderators, :username 
+4

Volví a subir esto porque quería el formulario de línea de comandos. Pero es una tontería que agregue la columna incluso cuando especifico 'add_index ...' y no 'add_column ...'. –

+1

Yeap, tal vez en la próxima versión. –

7

estoy usando los carriles 5 y las respuestas anteriores funcionan muy bien; Aquí hay otra manera que también trabajó para mí (el nombre de la tabla es :people y el nombre de la columna es :email_address)

class AddIndexToEmailAddress < ActiveRecord::Migration[5.0] 
    def change 
    change_table :people do |t| 
     t.index :email_address, unique: true 
    end 
    end 
end 
0

Es posible que desee agregar el nombre de la clave única tantas veces el valor por defecto unique_key nombre por raíles puede ser demasiado largo para el cual el DB puede arrojar el error.

Para agregar el nombre de su índice solo use la opción name:. La consulta migración podría ser algo como esto -

add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'

Más información - http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index

17

Como esto no se ha mencionado todavía, pero responde a la pregunta que tuve cuando me encontré con esta página, también puede especificar que un índice debe ser único al agregarla a través t.references o t.belongs_to:

create_table :accounts do |t| 
    t.references :user, index: { unique: true } # or t.belongs_to 

    # other columns... 
end 

(como de al menos rieles 4.2.7)

1
add_index :table_name, :column_name, unique: true 

Para indexar varias columnas juntas, debe pasar una matriz de nombres de columna en lugar de un nombre de columna individual.

Cuestiones relacionadas