使mongoid会话只读

时间:2015-01-26 11:37:27

标签: ruby-on-rails mongodb mongoid

我在mongoid.yml中有不同的会话,其中一个会话提供来自静态mongo数据库的数据。我想知道是否可能,以及#34;加载"处于只读模式的会话,因此不能对savecreatedestroydestroy_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_allStaticMappings.create(...)之类的内容。这可能吗?

我发现了这个Making an entire model read-only with Mongoid,但这不会阻止某人在模型实例上调用createdestroy

1 个答案:

答案 0 :(得分:2)

这是一个老问题,但我最近遇到了同样的问题,所以决定分享。虽然,我想注意,这不是一个per-sesson解决方案,而是一个每个模型的解决方案。

正如我所知,有两种方法可以实现:

1。重新定义readonly?

如果查看Mongoid代码,您将看到保存,删除或更新的所有函数,调用readonly?以检查模型是否为只读。没有真正记录并且有缺点 - 创建和创建!允许在这个模型上(破坏,更新,保存赢了然后运行)。

private

def readonly?
  true
end

2。自定义回调

除了之前的方法,您还可以添加回调以确保即使创建也不会通过:

before_create :readonly_secret

private

def readonly?
  true
end

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

实际上,您可以完全摆脱readonly?方法,并添加其他回调,例如before_savebefore_destroybefore_updatebefore_create

操纵" readonliness"

如果您觉得需要从运行时代码中操作只读状态,则可以为模型的类定义属性:

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