Docs Menu
Docs Home
/ /

Personalizar comportamientos de campo

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

Puede configurar los campos para que tengan valores predeterminados mediante el uso de default opción. Los valores de campo predeterminados pueden ser fijos o valores Proc.

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

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

El siguiente ejemplo especifica un valor predeterminado 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 }

Puede establecer un valor predeterminado que dependa del estado del documento usando la palabra clave self en una instancia Proc. El siguiente ejemplo establece el valor predeterminado fulfill_by 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

Establezca siempre la opción pre-processed en true para establecer un valor Proc predeterminado para el campo _id.

Puede especificar un nombre de campo independiente para almacenarlo en la base de datos, sin que la aplicación lo refiera a su nombre original. Esto permite 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 usando la opción alias_attribute. Especificar un alias no cambia la forma en que Mongoid almacena el campo en la base de datos, pero le permite acceder a él con un nombre diferente en su 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 eliminar un alias de campo, puede usar la opción unalias_attribute. El siguiente ejemplo elimina el alias del campo name:

class Band
unalias_attribute :n
end

También puede usar unalias_attribute para eliminar el alias predefinido id del campo _id. Esto permite almacenar valores diferentes en los campos _id y 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

De forma predeterminada, Mongoid define el campo _id en los documentos para que contenga un valor BSON::ObjectId que Mongoid genera automáticamente. Puede personalizar el tipo o especificar el valor predeterminado del campo _id indicándolo en su 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

Puede omitir el valor predeterminado del campo _id. Si no especifica un valor predeterminado para el campo, Mongoid conserva el documento sin el valor _id. Para los documentos de nivel superior, el servidor MongoDB asigna automáticamente el valor _id. Sin embargo, para los documentos incrustados, el servidor no asigna el valor _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 inconvertible si no se puede convertir al tipo de campo especificado. Por ejemplo, una matriz se considera inconvertible cuando se asigna a un Integer campo.

En la versión v8.0 y posteriores, Mongoid asigna nil a valores no convertibles. El valor original no convertible se almacena en el hash attributes_before_type_cast con sus nombres de campo.

Puede anular los métodos getter y setter predeterminados para un campo especificando un método con el mismo nombre que el campo y llamando al método read_attribute o write_attribute para operar en el valor del atributo sin procesar.

El siguiente ejemplo crea un captador y un definidor 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 un campo como de solo lectura con la opción attr_readonly. Esto le permite crear documentos con los atributos, pero no actualizarlos.

El siguiente ejemplo crea una clase Band y especifica el campo name como de 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 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 Sección Documentos de solo lectura de la guía Realizar operaciones de datos.

Mongoid admite campos localizados mediante el uso de i18n gemAl localizar un campo, Mongoid lo almacena como un hash de claves y valores de configuración regional. El acceso a los campos se realiza de la misma manera que a un valor de cadena. Puede localizar campos de cualquier tipo.

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.

Habilite las alternativas en una aplicación Rails configurando la opción config.i18n.fallbacks en su entorno y configurando los idiomas de alternativa:

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

Habilite las alternativas en aplicaciones que no sean Rails incluyendo el módulo en el backend i18n y configurando los idiomas de alternativa:

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

Después de habilitar las alternativas, si un idioma activo no tiene una traducción, se busca en el idioma de alternativa especificado.

Puede deshabilitar los idiomas de respaldo para un campo específico configurando 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 modifica automáticamente los criterios de consulta para que coincidan con la configuración regional actual. El siguiente ejemplo consulta la clase Product para obtener una revisión en la configuración regional 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 realizar consultas exhaustivas sobre campos localizados, le recomendamos indexar cada configuración regional sobre la que desee realizar consultas.

Volver

Tipos de Campos

En esta página