Respostas:
A resposta curta para versões antigas do Rails (veja outras respostas para o Rails 4+):
add_index :table_name, :column_name, unique: true
Para indexar várias colunas juntas, você passa uma matriz de nomes de colunas em vez de um único nome de coluna,
add_index :table_name, [:column_name_a, :column_name_b], unique: true
Se você receber "o nome do índice ... é muito longo", poderá adicionar name: "whatever"
ao método add_index para tornar o nome mais curto.
Para controle refinado, existe um execute
método " " que executa SQL direto.
É isso aí!
Se você estiver fazendo isso como um substituto para validações regulares de modelos antigos, verifique como ele funciona. O relatório de erros para o usuário provavelmente não será tão bom sem as validações no nível do modelo. Você sempre pode fazer as duas coisas.
indexed columns are not unique
erro ao tentar criar um índice exclusivo, talvez seja porque os dados na tabela já contêm duplicatas. Tente remover os dados duplicados e executar a migração novamente.
, :name => "whatever"
ao add_index
método para diminuir o nome.
trilhos geram migração add_index_to_table_name column_name: uniq
ou
trilhos geram migração add_column_name_to_table_name column_name: string: uniq: index
gera
class AddIndexToModerators < ActiveRecord::Migration
def change
add_column :moderators, :username, :string
add_index :moderators, :username, unique: true
end
end
Se você estiver adicionando um índice a uma coluna existente, remova ou comente a add_column
linha ou marque
add_column :moderators, :username, :string unless column_exists? :moderators, :username
add_index...
e não add_column...
.
Como isso ainda não foi mencionado, mas responde à pergunta que fiz quando encontrei esta página, você também pode especificar que um índice seja único ao adicioná-lo via t.references
ou t.belongs_to
:
create_table :accounts do |t|
t.references :user, index: { unique: true } # or t.belongs_to
# other columns...
end
(a partir de pelo menos Rails 4.2.7
)
Estou usando o Rails 5 e as respostas acima funcionam muito bem; aqui está outra maneira que também funcionou para mim (o nome da tabela é :people
e o nome da coluna é :email_address
)
class AddIndexToEmailAddress < ActiveRecord::Migration[5.0]
def change
change_table :people do |t|
t.index :email_address, unique: true
end
end
end
Você pode querer adicionar um nome para a chave exclusiva quantas vezes o nome padrão da chave única pelos trilhos puder ser muito longo para o qual o banco de dados possa gerar o erro.
Para adicionar um nome ao seu índice, basta usar a name:
opção A consulta de migração pode ser algo como isto -
add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'
Mais informações - http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index
Se você deixou de adicionar uma coluna exclusiva ao banco de dados, basta adicionar esta validação no modelo para verificar se o campo é exclusivo:
class Person < ActiveRecord::Base
validates_uniqueness_of :user_name
end
consulte aqui Acima é apenas para fins de teste, por favor, adicione o índice alterando a coluna DB, conforme sugerido por @Nate
consulte este índice para obter mais informações