sql >> Databáze >  >> NoSQL >> MongoDB

Nastavit mongoidní relaci pouze pro čtení

To je stará otázka, ale nedávno jsem se setkal se stejným problémem, takže jsem se rozhodl se podělit. I když si chci všimnout, že toto není řešení pro relaci, ale pro model.

Jak jsem zjistil, existují dva způsoby, jak to umožnit:

1. Předefinovat readonly?

Když se podíváte do kódu Mongoidu, uvidíte, že všechny funkce, které ukládají, mažou nebo aktualizují, volají readonly? zkontrolovat, zda je model pouze pro čtení. Není ve skutečnosti zdokumentováno a má nevýhodu - vytvářet a vytvářet! jsou u tohoto modelu povoleny (nepoběží však ničení, aktualizace, ukládání).

private

def readonly?
  true
end

2. Vlastní zpětné volání

Kromě předchozí metody můžete přidat zpětná volání, abyste zajistili, že neprojdou ani vytvoření:

before_create :readonly_secret

private

def readonly?
  true
end

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

V podstatě se můžete zbavit readonly? metodu dohromady a přidejte další zpětná volání, jako je before_save , before_destroy , before_update , before_create

Manipulujte s "readonliness"

pokud máte pocit, že potřebujete manipulovat se stavem pouze pro čtení z runtime kódu, můžete definovat atribut pro třídu vašeho modelu:

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



  1. Jak prettify exportované MongoDB dokumenty v mongoexportu

  2. mongoose model pro více typů uživatelů

  3. MongoDB fulltextové vyhledávání + řešení pro částečnou shodu slov

  4. Jak vynutit kontrolu typu pro hodnotu dokumentu v MongoDB?