MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Rendre la session mongoid en lecture seule

C'est une vieille question, mais j'ai rencontré le même problème récemment, alors j'ai décidé de partager. Cependant, je tiens à souligner qu'il ne s'agit pas d'une solution par session, mais d'une solution par modèle.

Comme je l'ai compris, il y a deux façons de rendre cela possible :

1. Redéfinir readonly?

Si vous parcourez le code Mongoid, vous verrez que toutes les fonctions qui sauvegardent, suppriment ou mettent à jour appellent readonly? pour vérifier si le modèle est en lecture seule. Pas vraiment documenté et a un inconvénient -- créez et créez ! sont autorisés sur ce modèle (les destructions, les mises à jour et les sauvegardes ne fonctionneront pas).

private

def readonly?
  true
end

2. Un rappel personnalisé

En plus de la méthode précédente, vous pouvez ajouter des rappels pour vous assurer que même les créations ne passeront pas :

before_create :readonly_secret

private

def readonly?
  true
end

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

Essentiellement, vous pouvez vous débarrasser de readonly? method alltogether, et ajoutez d'autres rappels tels que before_save , before_destroy , before_update , before_create

Manipuler "readonliness"

si vous ressentez le besoin de manipuler l'état en lecture seule à partir d'un code d'exécution, vous pouvez définir un attribut pour la classe de votre modèle :

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