Itu pertanyaan lama, tetapi saya menemui masalah yang sama baru-baru ini, jadi memutuskan untuk berbagi. Meskipun, saya ingin memperhatikan, bahwa ini bukan solusi per sesi, tetapi solusi per model.
Seperti yang saya ketahui, ada dua cara untuk mewujudkannya:
1. Definisikan ulang readonly?
Jika Anda melihat melalui kode Mongoid, Anda akan melihat bahwa semua fungsi yang menyimpan, menghapus, atau memperbarui, memanggil readonly?
untuk memeriksa apakah model hanya-baca. Tidak benar-benar didokumentasikan dan memiliki kekurangan -- buat dan buat! diperbolehkan pada model ini (menghancurkan, memperbarui, menyimpan tidak akan berjalan).
private
def readonly?
true
end
2. Panggilan balik khusus
Selain metode sebelumnya, Anda dapat menambahkan panggilan balik untuk memastikan bahwa pembuatan genap tidak akan melewati:
before_create :readonly_secret
private
def readonly?
true
end
def readonly_secret
raise Mongoid::Errors::ReadonlyDocument, self.class if readonly?
end
Pada dasarnya, Anda dapat menyingkirkan readonly?
metode semuanya, dan tambahkan panggilan balik lain seperti before_save
, before_destroy
, before_update
, before_create
Manipulasi "keterbacaan"
jika Anda merasa perlu untuk memanipulasi status read-only dari kode runtime, Anda dapat menentukan atribut untuk kelas model Anda:
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