MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongoid-Sitzung schreibgeschützt machen

Das ist eine alte Frage, aber ich bin kürzlich auf das gleiche Problem gestoßen, also habe ich beschlossen, es zu teilen. Allerdings möchte ich anmerken, dass dies keine Lösung pro Sitzung ist, sondern eine pro Modell.

Wie ich herausgefunden habe, gibt es zwei Möglichkeiten, dies zu ermöglichen:

1. Definieren Sie readonly? neu

Wenn Sie den Mongoid-Code durchsehen, werden Sie sehen, dass alle Funktionen, die speichern, löschen oder aktualisieren, readonly? aufrufen um zu prüfen, ob das Modell schreibgeschützt ist. Nicht wirklich dokumentiert und hat einen Nachteil - erstellen und erstellen! sind bei diesem Modell erlaubt (Zerstören, Aktualisieren, Speichern werden jedoch nicht ausgeführt).

private

def readonly?
  true
end

2. Ein benutzerdefinierter Rückruf

Zusätzlich zur vorherigen Methode können Sie Rückrufe hinzufügen, um sicherzustellen, dass selbst erstellte Elemente nicht durchgelassen werden:

before_create :readonly_secret

private

def readonly?
  true
end

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

Im Wesentlichen können Sie readonly? loswerden -Methode vollständig und fügen Sie andere Callbacks wie before_save hinzu , before_destroy , before_update , before_create

Manipulieren Sie "readonliness"

Wenn Sie den schreibgeschützten Zustand eines Laufzeitcodes manipulieren möchten, können Sie ein Attribut für die Klasse Ihres Modells definieren:

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