Overview
En esta guía, puede aprender a personalizar el comportamiento de los campos en los modelos Mongoid.
Especificar valores predeterminados
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.
Especificar nombres de almacenamiento
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.
Alias de campo
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.
Redefinición de campo
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
Campo de identificación personalizado
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.
Valores no convertibles
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.
Getters y setters personalizados
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
Atributos de solo lectura
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.
Localizar campos
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.