Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Personalizar comportamientos de campo

En esta guía, puedes aprender a personalizar el comportamiento de los campos en los modelos de Mongoid.

Puedes configurar los campos para que tengan valores por defecto utilizando la default opción. Los valores de campo por defecto pueden ser valores fijos o Proc.

El siguiente ejemplo especifica un valor por defecto fijo para el campo state:

class Order
include Mongoid::Document
field :state, type: String, default: 'created'
end

El siguiente ejemplo especifica un valor por defecto de Proc para el campo fulfill_by:

class Order
include Mongoid::Document
field :fulfill_by, type: Time, default: ->{ Time.now + 3.days }
end

Nota

El controlador evalúa valores predeterminados que no son Proc instancias al cargar la clase. El controlador evalúa Proc valores al instanciar el documento. Los siguientes valores de campo predeterminados no producen resultados equivalentes:

# Time.now is set to the time the class is loaded
field :submitted_at, type: Time, default: Time.now
# Time.now is set to the time the document is instantiated
field :submitted_at, type: Time, default: ->{ Time.now }

Puedes establecer un valor por defecto que dependa del estado del documento utilizando la palabra clave self en una instancia Proc. El siguiente ejemplo establece el valor fulfill_by por defecto para que dependa del estado del campo submitted_at:

field :fulfill_by, type: Time, default: ->{
self.submitted_at + 4.hours
}

De forma predeterminada, Mongoid aplica los valores predeterminados Proc después de configurar e inicializar todos los demás atributos. Para aplicar el valor predeterminado antes de configurar los demás atributos, configure la opción pre_processed en true, como se muestra en el siguiente ejemplo:

field :fulfill_by, type: Time, default: ->{ Time.now + 3.days },
pre_processed: true

Tip

Siempre configura la opción pre-processed en true para establecer un valor Proc por defecto para el campo _id.

Puede especificar un nombre de campo diferente para almacenar en la base de datos, y seguir refiriéndose al campo por su nombre original en su aplicación. Esto puede ahorrar espacio de almacenamiento, ya que MongoDB almacena toda la información de los campos junto con cada documento.

Puede establecer un nombre de almacenamiento alternativo con la palabra clave as:. El siguiente ejemplo crea un campo llamado name que Mongoid almacena en la base de datos como n:

class Band
include Mongoid::Document
field :n, as: :name, type: String
end

Mongoid almacena el campo name como "n", pero aún puedes acceder al campo como name en tu aplicación.

Puede crear un alias para su campo utilizando la opción alias_attribute. Especificar un alias no cambia cómo Mongoid almacena el campo en la base de datos, pero te permite acceder al campo por un nombre diferente en tu aplicación.

El siguiente ejemplo especifica un alias para el campo name:

class Band
include Mongoid::Document
field :name, type: String
alias_attribute :n, :name
end

Para remover un alias de campo, puedes utilizar la opción unalias_attribute. El siguiente ejemplo elimina el alias del campo name:

class Band
unalias_attribute :n
end

También puedes usar unalias_attribute para remover el alias predefinido id del campo _id. Esto se puede usar para almacenar diferentes valores en el campo _id y en un campo id.

Por defecto, Mongoid permite redefinir los campos en un modelo. Para generar un error cuando se redefina un campo, configura la opción de configuración duplicate_fields_exception en tu archivo mongoid.yml en true.

Si la opción duplicate_fields_exception está establecida en true, aún puede redefinir un campo específico estableciendo la opción overwrite en true al definirlo. El siguiente ejemplo define el campo name y luego lo redefine con la opción overwrite:

class Person
include Mongoid::Document
field :name
field :name, type: String, overwrite: true
end

Por defecto, Mongoid define el campo _id en los documentos para que contenga un valor BSON::ObjectId que Mongoid genera automáticamente. Puedes personalizar el tipo o especificar el valor por defecto del campo _id especificándolo en tu modelo.

El siguiente ejemplo crea una clase Band con un campo _id personalizado:

class Band
include Mongoid::Document
field :name, type: String
field :_id, type: String, default: ->{ name }
end

Puedes omitir el valor por defecto para el campo _id. Si no especificas un valor por defecto para el campo, Mongoid permite que el documento persista sin un valor _id. Para los documentos de nivel superior, el servidor de MongoDB asigna automáticamente un valor de _id. Sin embargo, para los documentos incrustados, el servidor no asigna un valor de _id.

Si no se especifica un valor para el campo _id, Mongoid no recupera el valor asignado automáticamente del servidor. Por lo tanto, no se puede recuperar el documento de la base de datos usando el valor _id.

Un valor se considera no convertible si no puede convertirse al tipo de campo especificado. Por ejemplo, se considera que un arreglo no se puede convertir cuando se asigna a un campo Integer.

En v8.0 y posteriores, Mongoid asigna nil a los valores que no se pueden convertir. El valor original que no se puede convertir se almacena en el hash attributes_before_type_cast junto con los nombres de sus campos.

Puedes sobrescribir los métodos getter y setter predeterminados para un campo especificando un método con el mismo nombre del campo y llamando al método read_attribute o write_attribute para operar sobre el valor bruto del atributo.

El siguiente ejemplo crea un getter y un setter personalizados para el campo name de una clase Person:

class Person
include Mongoid::Document
field :name, type: String
# Custom getter for 'name' to return the name in uppercase
def name
read_attribute(:name).upcase if read_attribute(:name)
end
# Custom setter for 'name' to store the name in lowercase
def name=(value)
write_attribute(:name, value.downcase)
end
end

Puede especificar que un campo sea de solo lectura indicando la opción attr_readonly. Esto te permite crear documentos con los atributos, pero no actualizarlos.

El siguiente ejemplo crea una clase Band y especifica el campo name como solo lectura:

class Band
include Mongoid::Document
field :name, type: String
field :origin, type: String
attr_readonly :name
end

Si se llama a un método de actualización masiva, como update_attributes, y se pasa un campo de solo lectura, Mongoid ignora dicho campo y actualiza todos los demás. Si se intenta actualizar explícitamente un campo de solo lectura, Mongoid genera una excepción ReadonlyAttribute.

Nota

Las llamadas a los operadores de persistencia atómica, como bit y inc, aún persisten los cambios en el campo de solo lectura.

Para obtener información sobre cómo especificar modelos completos como de solo lectura, consulte la Documentos de solo lectura sección de la guía Operaciones de datos de rendimiento.

Mongoid admite campos localizados mediante la i18n gem. Cuando localizas un campo, Mongoid almacena el campo como un hash de claves y valores de localizaciones. Acceder a los campos se comporta de la misma manera que un valor de string. Puedes localizar campos de cualquier tipo de campo.

El siguiente ejemplo crea una clase Product con un campo review localizado:

class Product
include Mongoid::Document
field :review, type: String, localize: true
end
I18n.default_locale = :en
product = Product.new
product.review = "Marvelous!"
I18n.locale = :de
product.review = "Fantastisch!"
product.attributes
# Outputs: { "review" => { "en" => "Marvelous!", "de" => "Fantastisch!" }

Puede obtener y configurar todas las traducciones a la vez llamando al método _translations:

product.review_translations
# Outputs: { "en" => "Marvelous!", "de" => "Fantastisch!" }
product.review_translations =
{ "en" => "Marvelous!", "de" => "Wunderbar!" }

Puede especificar opciones alternativas para campos localizados habilitando la funcionalidad i18n fallbacks.

Habilita sustituciones en una aplicación de Rails configurando el ajuste de configuración config.i18n.fallbacks en el entorno y estableciendo los idiomas de respaldo:

config.i18n.fallbacks = true
config.after_initialize do
I18n.fallbacks[:de] = [ :en, :es ]
end

Habilite las alternativas en aplicaciones que no sean de Rails incluyendo el módulo en el backend de i18n y estableciendo los lenguajes alternativos:

require "i18n/backend/fallbacks"
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
I18n.fallbacks[:de] = [ :en, :es ]

Una vez que las alternativas estén habilitadas, si un lenguaje activo no tiene una traducción, se buscará en el lenguaje alternativo especificado.

Puedes desactivar los idiomas alternativos para un campo especificado estableciendo la opción fallbacks en falso al definir el campo:

class Product
include Mongoid::Document
field :review, type: String, localize: true, fallbacks: false
end

Al consultar campos localizados, Mongoid altera automáticamente los criterios de la query para coincidir con la localización actual. El siguiente ejemplo query la clase Product para una revisión en la localización en:

# Match all products with Marvelous as the review. The current locale is :en.
Product.where(review: "Marvelous!")
# The resulting MongoDB query filter: { "review.en" : "Marvelous!" }

Nota

Si desea consultar de forma exhaustiva en campos localizados, le recomendamos la indexación de cada localización sobre la que desea consultar.

Volver

Validación de documentos

En esta página