Đó là một câu hỏi cũ, nhưng tôi gặp vấn đề tương tự gần đây, vì vậy quyết định chia sẻ. Mặc dù, tôi muốn lưu ý rằng đây không phải là giải pháp cho mỗi chuyến tàu, mà là một giải pháp cho mỗi mô hình.
Như tôi đã tìm ra, có hai cách để làm cho điều đó trở nên khả thi:
1. Xác định lại readonly?
Nếu bạn xem qua mã Mongoid, bạn sẽ thấy rằng tất cả các chức năng lưu, xóa hoặc cập nhật, gọi readonly?
để kiểm tra xem mô hình có ở chế độ chỉ đọc hay không. Không thực sự được ghi lại và có một nhược điểm - tạo và tạo! được phép trên mô hình này (hủy, cập nhật, lưu sẽ không chạy).
private
def readonly?
true
end
2. Gọi lại tùy chỉnh
Ngoài phương pháp trước đó, bạn có thể thêm (các) lệnh gọi lại để đảm bảo rằng ngay cả các lần tạo sẽ không chuyển qua:
before_create :readonly_secret
private
def readonly?
true
end
def readonly_secret
raise Mongoid::Errors::ReadonlyDocument, self.class if readonly?
end
Về cơ bản, bạn có thể loại bỏ readonly?
tất cả phương thức và thêm các lệnh gọi lại khác như before_save
, before_destroy
, before_update
, before_create
Thao tác "độ sẵn sàng"
nếu bạn cảm thấy cần phải thao tác trạng thái chỉ đọc từ mã thời gian chạy, bạn có thể xác định một thuộc tính cho lớp của mô hình của mình:
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