我在mongoid.yml
中有不同的会话,其中一个会话提供来自静态mongo数据库的数据。我想知道是否可能,以及#34;加载"处于只读模式的会话,因此不能对save
,create
,destroy
或destroy_all
进行更改。我的mongoid.yml
看起来像这样:
production:
sessions:
default:
database: my_app_production
hosts:
- localhost:27017
options:
read: primary
static_content:
database: static_content_db
hosts:
- localhost:27017
options:
read: primary
options:
use_utc: true
我有static_content
会话的特殊模型,它们看起来像这样:
class StaticMappings
include Mongoid::Document
include Mongoid::Attributes::Dynamic
store_in collection: "static_mappings", session: "static_content"
end
我想阻止自己形成意外调用StaticMappings.destroy_all
或StaticMappings.create(...)
之类的内容。这可能吗?
我发现了这个Making an entire model read-only with Mongoid,但这不会阻止某人在模型实例上调用create
或destroy
。
答案 0 :(得分:2)
这是一个老问题,但我最近遇到了同样的问题,所以决定分享。虽然,我想注意,这不是一个per-sesson解决方案,而是一个每个模型的解决方案。
正如我所知,有两种方法可以实现:
readonly?
如果查看Mongoid代码,您将看到保存,删除或更新的所有函数,调用readonly?
以检查模型是否为只读。没有真正记录并且有缺点 - 创建和创建!允许在这个模型上(破坏,更新,保存赢了然后运行)。
private
def readonly?
true
end
除了之前的方法,您还可以添加回调以确保即使创建也不会通过:
before_create :readonly_secret
private
def readonly?
true
end
def readonly_secret
raise Mongoid::Errors::ReadonlyDocument, self.class if readonly?
end
实际上,您可以完全摆脱readonly?
方法,并添加其他回调,例如before_save
,before_destroy
,before_update
,before_create
如果您觉得需要从运行时代码中操作只读状态,则可以为模型的类定义属性:
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