rails programar libro español ejemplos ruby-on-rails

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.