Puede utilizar validates
para validar uniqueness
en una columna:
validates :user_id, uniqueness: {scope: :friend_id}
La sintaxis para la validación en varias columnas es similar, pero se debe proporcione una matriz de campos en su lugar:
validates :attr, uniqueness: {scope: [:attr1, ... , :attrn]}
Sin embargo,, los enfoques de validación que se muestran arriba tienen una condición de carrera y no pueden garantizar la coherencia. Considere el ejemplo siguiente: registros de la tabla
base de datos se supone que son únicas por n campos;
múltiples (dos o más ) solicitudes simultáneas, manejadas por procesos separados cada uno (servidores de aplicaciones, servidores de trabajo de fondo o lo que sea que esté utilizando), base de datos de acceso a insertar el mismo registro en la tabla;
cada proceso en paralelo valida si hay un registro con los mismos campos n;
la validación de cada solicitud se pasa satisfactoriamente, y cada proceso crea un registro en la tabla con los mismos datos.
Para evitar este tipo de comportamiento, se debe agregar una restricción única db mesa.Se puede establecer con add_index
ayudante para uno (o varios) campo (s) ejecutando el siguiente migración:
class AddUniqueConstraints < ActiveRecord::Migration
def change
add_index :table_name, [:field1, ... , :fieldn], unique: true
end
end
Advertencia: incluso después de que haya configurado una restricción única, dos o más solicitudes simultáneas se trate de escribir los mismos datos a DB, pero en lugar de crear registros duplicados, esto elevará una excepción ActiveRecord::RecordNotUnique
, que debe manejar por separado:
begin
# writing to database
rescue ActiveRecord::RecordNotUnique => e
# handling the case when record already exists
end
perdóneme si estoy siendo muy tupido, pero ¿cómo podría ayudar eso en esta situación? – re5et
intente utilizar "validates_uniqueness_of" en su modelo. si esto no funciona intente crear un índice en el que pueda crear una migración de feilds que incluya una instrucción como add_index: table, [: column_a,: column_b],: unique => true) –
@HarryJoy, preguntó ' ¿Hay un camino de rieles? Y lo ofreces sin rieles, pero estándar. 'La forma Active Record afirma que la inteligencia pertenece a sus modelos, no a la base de datos. – Green