programar - ¿Cómo puedo hacer que una columna sea única e indexarla en una migración de Ruby on Rails?
ruby on rails ejemplos (7)
Me gustaría hacer una columna unique
en el script de migración de Ruby on Rails. ¿Cuál es la mejor manera de hacerlo? ¿También hay una manera de indexar una columna en una tabla?
Me gustaría imponer columnas unique
en una base de datos en lugar de simplemente usar :validate_uniqueness_of
.
rieles generan migración add_index_to_table_name column_name: uniq
o
los rieles generan migración add_column_name_to_table_name column_name: string: uniq: index
genera
class AddIndexToModerators < ActiveRecord::Migration
def change
add_column :moderators, :username, :string
add_index :moderators, :username, unique: true
end
end
Si está agregando un índice a una columna existente, elimine o comente la línea add_column
, o ponga un cheque
add_column :moderators, :username, :string unless column_exists? :moderators, :username
Como esto no se ha mencionado todavía, pero responde a la pregunta que tenía cuando encontré esta página, también puede especificar que un índice debe ser único al agregarlo mediante t.references
o t.belongs_to
create_table :accounts do |t|
t.references :user, index: { unique: true } # or t.belongs_to
# other columns...
end
(a partir de al menos rieles 4.2.7
)
Es posible que desee agregar un nombre para la clave única, ya que muchas veces el nombre de unique_key predeterminado por rieles puede ser demasiado largo para que el DB pueda generar el error.
Para agregar un nombre a su índice, solo use la opción name:
La consulta de 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
Estoy usando Rails 5 y las respuestas anteriores funcionan muy bien; Esta es otra forma en la que también me funcionó (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
La respuesta corta:
add_index :table_name, :column_name, unique: true
Para indexar varias columnas juntas, 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 un control más preciso, hay un método de " execute
" que ejecuta SQL directo.
¡Eso es!
Si está haciendo esto como un reemplazo para las validaciones de modelos antiguos regulares, simplemente verifique cómo funciona. No estoy seguro de que el informe de errores al usuario sea tan bueno. Siempre puedes hacer ambas cosas.
Si está creando una nueva tabla, puede usar el acceso directo en línea:
def change
create_table :posts do |t|
t.string :title, null: false, index: { unique: true }
t.timestamps
end
end
add_index :table_name, :column_name, unique: true
Para indexar varias columnas juntas, pasa una matriz de nombres de columna en lugar de un solo nombre de columna.