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).

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top