Eu tenho um Releasemodelo com mediume countrycolunas (entre outros). Não deve haver releasespartes medium/ countrycombinações idênticas .
Como eu escreveria isso como uma validação de trilhos?
Eu tenho um Releasemodelo com mediume countrycolunas (entre outros). Não deve haver releasespartes medium/ countrycombinações idênticas .
Como eu escreveria isso como uma validação de trilhos?
Respostas:
Você pode usar uma validação de exclusividade com a scopeopçã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
uniqueque 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 countrytodas as linhas com valores de mediume 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 :scopeparâmetro para o seu validador como este:
validates_uniqueness_of :medium, scope: :country
Veja a documentação para mais alguns exemplos.