Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Configurar validación de documentos

En esta guía, puedes aprender cómo definir reglas de validación en tus modelos de Mongoid. Después de implementar la validación en tus modelos, Mongoid impide ejecutar operaciones de guardar que infrinjan las reglas de validación. Utiliza la validación de documentos para restringir los tipos de datos y los rangos de valores de los campos de documentos en tus colecciones.

Incluye Mongoid ActiveModel::Validations de Active Record para proporcionar funcionalidad de validación, incluyendo un validador de asociación y de unicidad. Para obtener más información, consulta el Validaciones de Active Record guía de Rails y ActiveModel::Validations documentación de la API de Rails.

Nota

Comparación entre las validaciones de Mongoid y MongoDB

La validación en Mongoid se aplica solo en el contexto de tu aplicación y difiere de crear reglas de validación de esquema en MongoDB. Esto significa que sus reglas de validación no se aplican a las operaciones de escritura que se realizan fuera de su aplicación. Para obtener más información sobre la validación de esquema de MongoDB, consulta Validación de esquema en el Manual del servidor.

Mongoid admite asistentes de validación de Active Record que puedes usar al definir tus clases de modelo. Puedes utilizar estos asistentes para establecer reglas comunes de validación en tu aplicación, como comprobar la presencia de un campo, comparar el valor de un campo con un valor especificado o asegurarte de que un campo tenga un valor único.

Utiliza la macro validates para crear una regla de validación, luego incluye el asistente de validación y las especificaciones necesarias para la regla.

Tip

Cada asistente de validación acepta uno o varios nombres de campos, lo que te permite definir la misma regla para varios 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 aprender sobre otros útiles asistentes de validación en la sección Validaciones comunes de esta guía.

En esta sección puedes aprender sobre las siguientes reglas de validación comunes y ver ejemplos que utilizan asistentes de validación:

Puedes usar el asistente comparison para validar un documento en función del valor de un campo especificado.

El asistente 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 que el valor proporcionado.

  • equal_toEl valor debe ser igual al valor proporcionado.

  • less_than: El valor debe ser inferior al valor proporcionado.

  • less_than_or_equal_to: El valor debe ser menor o igual al valor proporcionado.

  • other_than: El valor debe ser diferente al valor suministrado.

Este ejemplo define las siguientes reglas de validación de comparación en el modelo Order:

  • delivery_dateDebe ser posterior (mayor) al valor de order_date

  • quantity: Debe ser menor que 5

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

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 asegurar que el campo username solo contenga letras:

class User
include Mongoid::Document
field :username, type: String
validates :username, format: { with: /\A[a-zA-Z]+\z/ }
end

Tip

Método asistente alternativo

El módulo Mongoid::Document proporciona métodos macro para ciertas validaciones. En lugar de utilizar el asistente de validación format en la instrucción de macro validates, puedes utilizar el método validates_format_of, como se muestra en el siguiente código:

validates_format_of :username, with: /\A[a-zA-Z]+\z/

Puedes usar los asistentes inclusion y exclusion para validar un documento en función de si el valor de un campo se encuentra en una lista de valores especificada. Utiliza 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 asegurar 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

Puedes utilizar los asistentes presence y absence para validar un documento según la presencia o ausencia (vacío) de un valor en un campo.

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 string vacía:

class Order
include Mongoid::Document
field :delivery_date, type: String
validates :delivery_date, absence: true
end

Tip

Método asistente alternativo

El módulo Mongoid::Document proporciona métodos macro para ciertas validaciones. En lugar de utilizar el asistente de validación presence en la instrucción de macro validates, puedes utilizar el método validates_presence_of, como se muestra en el siguiente código:

validates_presence_of :delivery_date

Puedes usar el asistente uniqueness para validar un documento según si el valor de un campo es único con respecto a otros valores en la colección. Puedes usar la opción scope para especificar uno o más nombres de campos que Mongoid utiliza para limitar la verificació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 en los documentos que tengan el mismo valor para 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 asistente alternativo

El módulo Mongoid::Document proporciona métodos macro para ciertas validaciones. En lugar de utilizar el asistente de validación uniqueness en la instrucción de macro validates, puedes utilizar 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 usas el método validates_uniqueness_of en un modelo, porque si consulta un 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) }

Puedes utilizar el validates_associated asistente para validar cualquier asociación que tenga tu modelo. Cuando incluyas esta regla de validación, Mongoid validará cualquier documento de asociación cada vez que intentes guardar una instancia. Para aprender más sobre las asociaciones, consulte lo siguiente Guías sobre asociaciones referenciadas y asociaciones integradas.

Este ejemplo define una regla de validación de asociación en el modelo Author para ejecutar las reglas de validación de las instancias Book incrustadas:

class Author
include Mongoid::Document
embeds_many :books
validates_associated :books
end

Importante

No se debe utilizar el asistente validates_associated en ambos extremos de sus asociaciones porque esto hace que Mongoid realice validaciones en un bucle infinito.

Se pueden utilizar los asistentes validates_each y validates_with para crear validadores personalizados. Para obtener más información sobre estos asistentes y ver ejemplos, consulte las referencias validates_each y validates_with en la documentación de Active Record.

Para aprender más sobre los validadores personalizados, consulte Realización de validaciones personalizadas en la documentación de Active Record.

Mongoid realiza la validación cuando persistes o guardas un documento en la base de datos. Los siguientes métodos activan tus reglas de validación, por lo que Mongoid guarda el objeto en la base de datos solo si pasa la validación:

  • create

  • save

  • update

Cuando utilizas la versión de dichos métodos con el sufijo !, Mongoid devuelve una excepción Mongoid::Errors::Validations si la validación falla para un objeto.

Puedes ejecutar las validaciones manualmente utilizando el método valid?. Este método devuelve true si el objeto pasa 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 manera diferente a Active Record al ejecutar valid? en datos persistidos. valid? de Active Record ejecuta todas las validaciones, pero valid? de Mongoid solo ejecuta validaciones en documentos que están en memoria para optimizar el rendimiento.

Para obtener más información sobre los tipos de campos que se pueden utilizar en los modelos de Mongoid, consulte la guía Usar tipos de campo BSON.

Para obtener más información sobre los métodos de validación y las macros en Mongoid, consulta la referencia del módulo Mongoid::Validatable en la documentación de la API.

Para ver una lista completa de asistentes de validaciones en Active Record, consulte la referencia ActiveModel::Validations::HelperMethods en la documentación de la API de Rails.

Volver

Documentos

En esta página