MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Tornar a sessão mongoide somente leitura


Essa é uma pergunta antiga, mas encontrei o mesmo problema recentemente, então decidi compartilhar. Embora, quero observar, que esta não é uma solução por sessão, mas por modelo.

Como eu descobri, existem duas maneiras de tornar isso possível:

1. Redefinir readonly?


Se você examinar o código Mongoid, verá que todas as funções que salvam, excluem ou atualizam chamam readonly? para verificar se o modelo é somente leitura. Não está realmente documentado e tem uma desvantagem - criar e criar! são permitidos neste modelo (destroys, updates, saves não serão executados).
private

def readonly?
  true
end

2. Um retorno de chamada personalizado


Além do método anterior, você pode adicionar callbacks para garantir que nem as criações passem:
before_create :readonly_secret

private

def readonly?
  true
end

def readonly_secret
  raise Mongoid::Errors::ReadonlyDocument, self.class if readonly?
end

Essencialmente, você pode se livrar de readonly? método todos juntos e adicione outros retornos de chamada, como before_save , before_destroy , before_update , before_create

Manipule a "leitura"


se você sentir a necessidade de manipular o estado somente leitura de um código de tempo de execução, você pode definir um atributo para a classe do seu modelo:
before_create :readonly_secret

class << self
  attr_accessor :readonly
end

private

def readonly?
  self.class.readonly.nil? ? true : self.class.readonly
end

def readonly_secret
  raise Mongoid::Errors::ReadonlyDocument, self.class if readonly?
  true
end