Eu tenho um Release
modelo com medium
e country
colunas (entre outros). Não deve haver releases
partes medium
/ country
combinações idênticas .
Como eu escreveria isso como uma validação de trilhos?
Eu tenho um Release
modelo com medium
e country
colunas (entre outros). Não deve haver releases
partes medium
/ country
combinações idênticas .
Como eu escreveria isso como uma validação de trilhos?
Respostas:
Você pode usar uma validação de exclusividade com a scope
opção
Além disso, você deve adicionar um índice exclusivo ao banco de dados para impedir que novos registros passem nas validações quando verificados ao mesmo tempo antes de serem gravados:
class AddUniqueIndexToReleases < ActiveRecord::Migration
def change
add_index :releases, [:country, :medium], unique: true
end
end
class Release < ActiveRecord::Base
validates :country, uniqueness: { scope: :medium }
end
unique
que não é reconhecido. Para essa parte, usei a resposta abaixo.
uniqueness
, não unique
. Consulte a documentação vinculada. Corrigindo a resposta.
Todas as respostas acima estão faltando como validar a exclusividade de vários atributos em um modelo. O código abaixo pretende dizer como usar vários atributos em um escopo.
validates :country, uniqueness: { scope: [:medium, :another_medium] }
Valida a exclusividade de country
todas as linhas com valores de medium
e another_medium
.
Nota: Não se esqueça de adicionar um índice na coluna acima, isso garante recuperação rápida e adiciona uma validação no nível do banco de dados para registros exclusivos.
Atualização: Para adicionar um índice ao criar tabela
t.index [:medium, :another_medium], unique: true
Você pode passar um :scope
parâmetro para o seu validador como este:
validates_uniqueness_of :medium, scope: :country
Veja a documentação para mais alguns exemplos.