sql >> Base de Datos >  >> NoSQL >> MongoDB

Hacer que la sesión mongoide sea de solo lectura

Esa es una vieja pregunta, pero encontré el mismo problema recientemente, así que decidí compartir. Aunque quiero señalar que esta no es una solución por sesión, sino por modelo.

Como descubrí, hay dos formas de hacerlo posible:

1. ¿Redefinir readonly?

Si revisa el código Mongoid, verá que todas las funciones que guardan, eliminan o actualizan, llaman a readonly? para comprobar si el modelo es de sólo lectura. No está realmente documentado y tiene un inconveniente:¡crear y crear! están permitidos en este modelo (aunque las operaciones de destrucción, actualización y guardado no se ejecutarán).

private

def readonly?
  true
end

2. Una devolución de llamada personalizada

Además del método anterior, puede agregar devoluciones de llamada para asegurarse de que ni siquiera las creaciones pasen:

before_create :readonly_secret

private

def readonly?
  true
end

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

Esencialmente, puede deshacerse de readonly? método en conjunto, y agregue otras devoluciones de llamada como before_save , before_destroy , before_update , before_create

Manipular "readonliness"

si siente la necesidad de manipular el estado de solo lectura desde un código de tiempo de ejecución, puede definir un atributo para la clase de su 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