Rieles: valide la unicidad de dos columnas (juntas)


Respuestas:


230

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

+1 para el índice, pero -1 para el uniqueya que no se reconoce. Para esa parte, he usado la respuesta a continuación.
Aleks

77
Sí, lo siento, la clave de validación debería ser uniqueness, no unique. Ver la documentación vinculada. Arreglando la respuesta.
tompave

1
Hm, bien, gracias :) Para repetirme, poner el índice lleva la solución al siguiente nivel, y no solo como otras soluciones de "codificación" con las que me he estado encontrando, antes de encontrar esta respuesta. +1 para eso
Aleks

70

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

41

Puede pasar un :scopeparámetro a su validador así:

validates_uniqueness_of :medium, scope: :country

Vea la documentación para algunos ejemplos más.


8
@DennisBest "funciona", pero no protege contra las condiciones de carrera. Si dos clientes realizan solicitudes simultáneas, ambos podrían pasar la validación si ninguno de los dos se confirma en la base de datos antes de que el otro sea validado. También necesita una restricción única de la base de datos como en la respuesta de tompave.
soupdog
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.