MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Rendi la sessione mongoide di sola lettura

Questa è una vecchia domanda, ma ho riscontrato lo stesso problema di recente, quindi ho deciso di condividere. Anche se, voglio notare, che questa non è una soluzione per sessione, ma per modello.

Come ho capito, ci sono due modi per renderlo possibile:

1. Ridefinire readonly?

Se guardi il codice Mongoid, vedrai che tutte le funzioni che salvano, eliminano o aggiornano, chiamano readonly? per verificare se il modello è di sola lettura. Non è realmente documentato e presenta uno svantaggio:crea e crea! sono consentiti su questo modello (tuttavia, le distruzioni, gli aggiornamenti, i salvataggi non verranno eseguiti).

private

def readonly?
  true
end

2. Una richiamata personalizzata

Oltre al metodo precedente, puoi aggiungere callback per assicurarti che anche le creazioni non passino:

before_create :readonly_secret

private

def readonly?
  true
end

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

In sostanza, puoi sbarazzarti di readonly? metodo del tutto e aggiungi altri callback come before_save , before_destroy , before_update , before_create

Manipolare la "prontezza"

se senti la necessità di manipolare lo stato di sola lettura da un codice di runtime, puoi definire un attributo per la classe del tuo modello:

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