Como definir uma restrição "única" em uma coluna da tabela MySQL em Ruby on Rails 3?
-
25-09-2019 - |
Pergunta
Eu tenho uma tabela MySQL simples com uma coluna: name
.
Eu gostaria de definir uma restrição única nesta coluna.
Eu posso fazer:
class MyModel < ActiveRecord::Base
validates_uniqueness_of :my_column_name
end
Mas funcionará apenas no nível do aplicativo, não no nível do banco de dados.
O que você sugeriria ?
Solução
Isso não é super-ajudante, mas parece que não há uma ótima resposta para aplicar a singularidade no nível do banco de dados. De Guia de migração de trilhos:
A Way de Registro Ativo afirma que a inteligência pertence aos seus modelos, não no banco de dados. Como tal, recursos como gatilhos ou restrições de chave estrangeira, que empurram parte dessa inteligência de volta ao banco de dados, não são muito usadas.
Valitações como Vidadates_uniqueness_of são uma maneira pela qual os modelos podem aplicar a integridade dos dados.
Embora o registro ativo não forneça nenhuma ferramenta para trabalhar diretamente com esses recursos, o método de execução pode ser usado para executar o SQL arbitrário.
Parece que executar o comando SQL com o método ActiveRecord Execute pode ser o melhor caminho a percorrer se você realmente deseja aplicar a singularidade no banco de dados.
Outras dicas
Adicione uma restrição única ao próprio banco de dados usando:
add_index :my_models, :my_column_name, unique: true
... Através de uma migração (e você pode querer fazer com que My_Column_Name não aceite nenhum valores nulos também:
class CreateMyModels < ActiveRecord::Migration
def change
create_table :my_models do |t|
t.string :my_column_name, null: false
t.timestamps
end
add_index :my_models, :my_column_name, unique: true
end
end