Tengo un Releasemodelo con mediumy countrycolumnas (entre otros). No debería haber releasesese compartir idéntico medium/ countrycombinaciones.
¿Cómo escribiría esto como una validación de rieles?
Tengo un Releasemodelo con mediumy countrycolumnas (entre otros). No debería haber releasesese compartir idéntico medium/ countrycombinaciones.
¿Cómo escribiría esto como una validación de rieles?
Respuestas:
Puede usar una validación de unicidad con la scopeopción.
Además, debe agregar un índice único a la base de datos para evitar que nuevos registros pasen las validaciones cuando se verifiquen al mismo tiempo antes de escribirse:
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
uniqueya que no se reconoce. Para esa parte, he usado la respuesta a continuación.
uniqueness, no unique. Ver la documentación vinculada. Arreglando la respuesta.
A todas las respuestas anteriores les falta cómo validar la unicidad de múltiples atributos en un modelo. El siguiente código tiene la intención de decir cómo usar múltiples atributos en un ámbito.
validates :country, uniqueness: { scope: [:medium, :another_medium] }
Valida la unicidad de countryen todas las filas con valores de mediumy another_medium.
Nota: No olvide agregar un índice en la columna anterior, esto asegura una recuperación rápida y agrega una validación de nivel de base de datos para registros únicos.
Actualización: para agregar un índice al crear una tabla
t.index [:medium, :another_medium], unique: true
Puede pasar un :scopeparámetro a su validador así:
validates_uniqueness_of :medium, scope: :country
Vea la documentación para algunos ejemplos más.