Respuesta

5

Esto no es muy útil, pero parece que no hay una gran respuesta para aplicar la exclusividad en el nivel de la base de datos. De Rails migration guide:

La forma Active Record afirma que la inteligencia pertenece a los modelos, no a la base de datos. Como tal, las características tales como desencadenantes o restricciones de clave externa, que empujan parte de esa inteligencia de vuelta a la base de datos, no son muy utilizadas.

Validaciones como validates_uniqueness_of son una forma en que los modelos pueden hacer cumplir la integridad de los datos.

Aunque Active Record no proporciona ninguna herramienta para trabajar directamente con dichas funciones, el método de ejecución se puede utilizar para ejecutar SQL arbitrario.

Parece que ejecutar el comando SQL usted mismo con el método de ejecución ActiveRecord puede ser la mejor manera de hacerlo si realmente desea aplicar unicidad en la base de datos.

32

Agregar una restricción única a la propia base de datos usando:

add_index :my_models, :my_column_name, unique: true 

... a través de una migración (y es posible que desee hacer que my_column_name no acepta ninguna valores nulos también:

class CreateMyModels < ActiveRecord::Migration 
    def change 
    create_table :my_models do |t| 
     t.string :my_column_name, null: false 

     t.timestamps 
    end 

    add_index :my_models, :my_column_name, unique: true 

    end 
end 
+4

Este la respuesta es mucho mejor que otras. Para una restricción única en columnas múltiples, puede ser así 'add_index: my_models, [: mi_nombre_columna1,: mi_nombre_columna2], único: verdadero' –

+0

¿Cómo se prueba esto? En lo que respecta a Rails, un modelo aún no salvado que viola esta restricción sigue siendo un modelo válido porque pasa las restricciones de la capa de aplicación del modelo. Es un poco complicado tener que tratar de guardarlo y luego ver un error RecordNotUnique de la base de datos. – drewww

+0

drewww: Esto normalmente es útil en situaciones donde tienes un método de fábrica para crear modelos y múltiples hilos de ejecución, donde las limitaciones de la capa de aplicación pueden ser engañadas por el hecho de que las validaciones de registros pueden depender de la presencia de otros registros (ejemplo: nombres de usuario únicos)) – Grayson

Cuestiones relacionadas