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 ?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top