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