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"
aoadd_index
método para diminuir o nome.ou
gera
Se você estiver adicionando um índice a uma coluna existente, remova ou comente a
add_column
linha ou marquefonte
add_index...
e nãoadd_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
out.belongs_to
:(a partir de pelo menos Rails
4.2.7
)fonte
Se você estiver criando uma nova tabela, poderá usar o atalho embutido:
fonte
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
)fonte
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
fonte
Para indexar várias colunas juntas, você passa uma matriz de nomes de colunas em vez de um único nome de coluna.
fonte
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:
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
fonte