Customize Callbacks for Data Models
Nesta página
Visão geral
Neste guia, você pode aprender como implementar retornos de chamada em seus modelos Mongoid para personalizar o ciclo de vida de suas instâncias de modelo.
Chamadas de resposta são métodos que o Mongoid aciona em momentos específicos do ciclo de vida de um objeto. Eles permitem que você inicie ações especificadas antes ou depois das alterações no estado de um objeto.
O Mongoid implementa muitas das chamadas de resposta do Active Record. Para saber mais,consulte Chamadas de resposta na documentação do Active Record.
Chamadas de resposta suportadas
O Mongoid é compatível com os seguintes retornos de chamada em classes de modelo que implementam o módulo Documento:
after_initialize
after_build
before_validation
after_validation
before_create
around_create
after_create
after_find
before_update
around_update
after_update
before_upsert
around_upsert
after_upsert
before_save
around_save
after_save
before_destroy
around_destroy
after_destroy
Para saber mais sobre qualquer um dos tipos de chamada de resposta anteriores, consulte a referência ActiveRecord::Callbacks na documentação da API do Rails.
Você pode implementar retornos de chamada em modelos de documento incorporado .
Observação
Comportamento da invocação de retorno de chamada
Para maior eficiência, o Mongoid invoca o chamada de resposta somente no documento em que você executou a ação de persistência. Esse comportamento permite que o Mongoid ofereça suporte a grandes hierarquias e lide com atualizações atômicas otimizadas de forma eficiente, não invocando chamadas de resposta em toda a hierarquia do documento .
Tenha cuidado e garanta a capacidade de teste ao implementar chamadas de resposta para a lógica de domínio, pois esses projetos podem levar a erros inesperados quando as chamadas de resposta na cadeia interromperem a execução. Recomendamos o uso de chamadas de resposta para preocupações transversais fora da funcionalidade principal do seu programa, como o enfileiramento de trabalhos em segundo plano.
Chamadas de resposta de documentos
Você deve implementar e registrar retornos de chamada em suas classes de modelo. Você pode registrar uma chamada de resposta usando métodos comuns, blocos e objetos Proc
, ou definindo objetos de chamada de resposta personalizados que usam classes ou módulos.
Este exemplo demonstra como registrar chamadas de resposta na classe de modelo Contact
das seguintes maneiras:
Inclui o método de classe
before_save
, que aciona o métodoprocess_phone
antes que uma instânciaContact
seja salva no MongoDB. O métodoprocess_phone
é definido separadamente na classe.Inclui o método de classe
after_destroy
e utiliza um bloco para imprimir uma mensagem quando uma instância doContact
é excluída.
class Contact include Mongoid::Document field :name, type: String field :phone, type: String # Creates a callback to clean phone numbers before saving before_save :process_phone protected def process_phone self.phone = phone.gsub(/[^0-9]/, "") if attribute_present?("phone") end # Creates a callback to send a message about object deletion after_destroy do p "deleted the contact for #{name}" end end
O seguinte código executa operações de dados que demonstram as ações de chamada de resposta :
Contact.create(name: 'Serena Atherton', phone: '999 555-3030') # => `phone` field saved as '9995553030' Contact.create(name: 'Zayba Haq', phone: '999 123?5050') # => `phone` field saved as '9991235050' Contact.first.destroy # => Console message: "deleted the contact for Serena Atherton"
Como a funcionalidade de chamada de resposta vem do Active Support, você pode usar a sintaxe do método de classe set_callback
para registrar as chamadas. O código a seguir demonstra como usar essa sintaxe para criar uma chamada de resposta que armazena os valores originais do campo name
na array aliases
:
class Contact include Mongoid::Document field :name, type: String field :phone, type: String field :aliases, type: Array, default: [] set_callback(:update, :before) do |document| if document.name_changed? document.push(aliases: document.name_was) end end end Contact.create(name: 'Xavier Bloom', phone: '4447779999') Contact.first.update(name: 'Xav - coworker') # Saved document in MongoDB: # {"aliases":["Xavier Bloom"],"name":"Xav - coworker","phone":"4447779999"}
Chamadas de resposta de associação
O Mongoid fornece as seguintes chamadas de resposta de associação:
after_add
after_remove
before_add
before_remove
Se você registrar uma chamada de resposta de associação em sua classe de modelo, ela será invocada sempre que você adicionar ou remover um documento de qualquer uma das seguintes associações:
embeds_many
has_many
has_and_belongs_to_many
Especifique as chamadas de resposta da associação como opções na respectiva associação. Você deve passar o documento adicionado ou removido como parâmetro para a chamada de resposta especificada.
O código a seguir demonstra como registrar uma chamada de resposta de associação em uma classe de modelo User
que incorpora várias instâncias SavedArticle
para limitar o número de documentos incorporados em uma única instância:
class User include Mongoid::Document field :username, type: String # Registers the callback in the association statement embeds_many :saved_articles, before_add: :send_message protected # Passes the association document as a parameter to the callback def send_message(saved_article) if saved_articles.count >= 10 p "you can't save more than 10 articles at a time" throw(:abort) end end end class SavedArticle include Mongoid::Document embedded_in :user field :url, type: String end
Informações adicionais
Para saber como impedir que o Mongoid execute chamadas de resposta, consulte as seguintes referências na documentação do Active Record:
Para saber como o Mongoid gerencia chamadas de resposta em transações, consulte o guia Transações e sessões.
Para saber como acessar e alterar seus dados MongoDB , consulte os guias Interagir com dados.