Menu Docs

Customize Callbacks for Data Models

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.

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.

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étodo process_phone antes que uma instância Contact seja salva no MongoDB. O método process_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 do Contact é 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"}

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

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.