Como pular retornos de chamada em documentos mongóides?
-
27-09-2019 - |
Pergunta
Minha pergunta é semelhante a este Como pular retornos de chamada do ActiveRecord? Mas, em vez de AR, estou usando o Mongoid, parece que ainda não foi implementado na versão atual do Mongoid, então eu gostaria de saber o que deveria ser uma solução elegante para implementá -la. (se necessário).
Solução
Sim você pode!
Mongoid é construído no ActiveModel e o ActiveModel tem um função skip_callback. Você pode usar skip_callback
assim:
# skip the callback
MyModelClass.skip_callback(:save, :before, :ensure_foo_is_not_bar)
my_model_instance.update_attributes :foo => 'bar'
# restore the callback for future calls
MyModelClass.set_callback(:save, :before, :ensure_foo_is_not_bar)
Estou usando isso sem problemas em um grande aplicativo. Para mais informações, consulte esta postagem do blog de Jeff Kreeftmeijer:
http://jeffkreeftmeijer.com/2010/disabling-activeModel-callbacks/
Outras dicas
Pode ser mais fácil usar as operações atômicas mongóides (definidas, desmembradas, etc.):
http://mongoid.org/en/mongoid/docs/persistence.html#atomic
Estes não disparam retornos de chamada.
EDIT: Mongoid 3 diz que não dispara retornos de chamada. Estou vendo -os de retorno de chamada em Mongoid 2. Então YMMV
Acabei usando a sugestão de Brian Armstrong e simplesmente ligando
person.set(name:"Robert Pulson")
no meu retorno de chamada após salvar.
Muitas vezes, isso surge quando você deseja fazer uma atualização sem disparar todos os retornos de chamada em um grande volume de itens. Isso pode ser feito descendo ao motorista:
Substituindo 'Foo' por 'bar' no campo 'x'.
User.all.each do |u|
User.collection.where({ _id: u.id }).update({
"$set" => { :x => u.x.gsub('foo', 'bar')
})
end
Eu procuro no código. E não há como evitar retorno de chamada em mongóides. Na versão 1.9 e 2.0.
Você precisa fazer um patch ou uma solicitação de recurso sobre isso.