Overview
En esta guía, aprenderá a definir reglas de validación en sus modelos Mongoid. Tras implementar la validación en sus modelos, Mongoid le impedirá ejecutar operaciones de escritura que infrinjan las reglas de validación. Utilice la validación de documentos para restringir los tipos de datos y los rangos de valores de los campos de documentos en sus colecciones.
Mongoid incluye ActiveModel::Validations de Active Record para proporcionar funcionalidad de validación, incluyendo un validador asociado y de unicidad. Para obtener más información, consulte Validaciones de registros activosGuía de Rails y documentación de la API de Rails ActiveModel::Validations.
Nota
Comparación de la validación de Mongoid y MongoDB
La validación en Mongoid solo se aplica en el contexto de la aplicación y difiere de la creación de reglas de validación de esquemas en MongoDB. Esto significa que las reglas de validación no se aplican a las operaciones de escritura realizadas fuera de la aplicación. Para obtener más información sobre la validación de esquemas en MongoDB, consulte Validación de esquemas en el manual del servidor.
Ayudantes de validación
Mongoid admite ayudantes de validación de registros activos que puede usar al definir sus clases de modelo. Puede usar estos ayudantes para establecer reglas de validación comunes en su aplicación, como comprobar la presencia de un campo, comparar el valor de un campo con un valor especificado o garantizar que un campo tenga un valor único.
Definir una regla de validación
Utilice la macro validates para crear una regla de validación, luego incluya el asistente de validación y las especificaciones requeridas para la regla.
Tip
Cada asistente de validación acepta uno o más nombres de campo, lo que le permite definir la misma regla para múltiples campos.
El siguiente código demuestra cómo utilizar el asistente de validación presence para requerir que las instancias Person contengan un valor para el campo name:
class Person include Mongoid::Document field :name, type: String validates :name, presence: true end
Puede obtener más información sobre otras herramientas de validación útiles en la sección Validaciones comunes de esta guía.
Validaciones comunes
En esta sección, puede obtener información sobre las siguientes reglas de validación comunes y ver ejemplos que utilizan ayudantes de validación:
Regla de comparación
Puede utilizar el ayudante comparison para validar un documento según el valor de un campo específico.
El ayudante comparison admite las siguientes opciones:
greater_than: El valor debe ser mayor que el valor proporcionado.greater_than_or_equal_to:El valor debe ser mayor o igual al valor suministrado.equal_to:El valor debe ser igual al valor suministrado.less_than:El valor debe ser menor que el valor suministrado.less_than_or_equal_to:El valor debe ser menor o igual al valor proporcionado.other_than:El valor debe ser diferente del valor suministrado.
Este ejemplo define las siguientes reglas de validación de comparación en el modelo Order:
delivery_date:Debe ser posterior a (mayor que) el valor deorder_datequantity: Debe ser menor que5
class Order include Mongoid::Document field :order_date, type: DateTime field :delivery_date, type: DateTime field :quantity, type: Integer validates :delivery_date, comparison: { greater_than: :order_date } validates :quantity, comparison: { less_than: 5 } end
Regla de formato
Puedes utilizar el asistente format para validar un documento en función de si el valor de un campo coincide con una expresión regular. Utiliza la opción with para especificar la expresión regular.
Este ejemplo define una regla de validación de formato en el modelo User para garantizar que el campo username contenga solo letras:
class User include Mongoid::Document field :username, type: String validates :username, format: { with: /\A[a-zA-Z]+\z/ } end
Tip
Método de ayuda alternativo
El módulo Mongoid::Document proporciona métodos macro para ciertas validaciones. En lugar de usar el asistente de validación format en la sentencia de macro validates, puede usar el método validates_format_of, como se muestra en el siguiente código:
validates_format_of :username, with: /\A[a-zA-Z]+\z/
Regla de inclusión o exclusión
Puede usar los ayudantes inclusion y exclusion para validar un documento según si el valor de un campo está en una lista de valores especificada. Use la opción in para especificar la lista de valores.
Este ejemplo define una regla de validación de inclusión en el modelo Order para garantizar que el valor del campo shipping sea uno de los valores aceptados:
class Order include Mongoid::Document field :shipping, type: String validates :shipping, inclusion: { in: %w(standard priority overnight) } end
Regla de presencia o ausencia
Puede utilizar los ayudantes presence y absence para validar un documento en función de si un valor de campo está presente o ausente (vacío).
Este ejemplo define una regla de validación de ausencia en el modelo Order para garantizar que el valor del campo delivery_date sea nil o una cadena vacía:
class Order include Mongoid::Document field :delivery_date, type: String validates :delivery_date, absence: true end
Tip
Método de ayuda alternativo
El módulo Mongoid::Document proporciona métodos macro para ciertas validaciones. En lugar de usar el asistente de validación presence en la sentencia de macro validates, puede usar el método validates_presence_of, como se muestra en el siguiente código:
validates_presence_of :delivery_date
Regla de unicidad
Puede usar el asistente uniqueness para validar un documento en función de si el valor de un campo es único respecto a otros valores de la colección. Puede usar la opción scope para especificar uno o más nombres de campo que Mongoid utiliza para limitar la comprobación de unicidad.
Este ejemplo define una regla de validación de unicidad en el modelo Person para garantizar que el valor del campo first_name sea único dentro de los documentos que tienen el mismo valor last_name:
class Person include Mongoid::Document field :first_name, type: String field :last_name, type: String validates :first_name, uniqueness: { scope: :last_name } end
Tip
Método de ayuda alternativo
El módulo Mongoid::Document proporciona métodos macro para ciertas validaciones. En lugar de usar el asistente de validación uniqueness en la sentencia de macro validates, puede usar el método validates_uniqueness_of, como se muestra en el siguiente código:
validates_uniqueness_of :first_name
Mongoid utiliza una preferencia de lectura primary cuando se usa el método validates_uniqueness_of en un modelo, porque si consulta a un miembro secundario del conjunto de réplicas, podría leer datos obsoletos.
Este método toma una opción conditions que le permite especificar condiciones para agregar cuando Mongoid verifica la unicidad:
validates_uniqueness_of :name, conditions: -> { where(:age.gte => 10) }
Validar asociaciones
Puede usar el asistente validates_associated para validar cualquier asociación que tenga su modelo. Al incluir esta regla de validación, Mongoid valida cualquier documento de asociación cada vez que intenta guardar una instancia. Para obtener más información sobre las asociaciones, consulte
Guía de asociaciones.
Este ejemplo define una regla de validación de asociación en el modelo Author para ejecutar las reglas de validación para las instancias Book integradas:
class Author include Mongoid::Document embeds_many :books validates_associated :books end
Importante
No utilice el asistente validates_associated en ambos extremos de sus asociaciones porque esto hace que Mongoid realice validaciones en un bucle infinito.
Reglas de validación personalizadas
Puede usar los validates_each validates_with ayudantes y para crear validadores personalizados. Para obtener más información sobre estos ayudantes y ver ejemplos, consulte las referencias a validates_each y validates_with en la documentación de Active Record.
Para obtener más información sobre los validadores personalizados,consulte Realizar validaciones personalizadas en la documentación de Active Record.
Comportamiento
Mongoid realiza la validación al persistir o guardar un documento en la base de datos. Los siguientes métodos activan las reglas de validación, por lo que Mongoid guarda el objeto en la base de datos solo si supera la validación:
createsaveupdate
Cuando se utiliza la versión con sufijo !de los métodos anteriores, Mongoid devuelve una excepción Mongoid::Errors::Validations si falla la validación de un objeto.
Validación de disparadores
Puede ejecutar validaciones manualmente con el método valid?. Este método devuelve true si el objeto supera la validación y false en caso contrario:
class Person include Mongoid::Document field :name, type: String field :age, type: Integer validates :age, comparison: { greater_than_or_equal_to: 0 } end # Returns true Person.new(name: "Berta Odom", age: 4).valid? # Returns false Person.new(name: "Cody Peng", age: -5).valid?
Mongoid se comporta de forma diferente a Active Record al ejecutar valid? en datos persistentes. El valid? de Active Record ejecuta todas las validaciones, pero el valid? de Mongoid solo las ejecuta en los documentos en memoria para optimizar el rendimiento.
Información Adicional
Para obtener más información sobre los tipos de campos que puede utilizar en los modelos Mongoid, consulte la guía Tipos de campos.
Para obtener más información sobre los métodos de validación y macros en Mongoid, consulte la referencia del módulo Mongoid::Validatable en la documentación de la API.
Para ver una lista completa de ayudantes de validación en Active Record, consulte la referencia ActiveModel::Validations::HelperMethods en la documentación de la API de Rails.