如何禁用Mongoid继承? (Ingore _type字段)

时间:2018-01-11 05:54:34

标签: ruby-on-rails mongoid

我将在一个应用程序中利用Mongoid的单一集合继承。但是,有一个地方我想禁用此功能。我正在考虑数据库迁移(使用mongoid_rails_migrations gem),我重新定义模型以使我的迁移更易于维护。在这种情况下,我希望将_type字段视为普通属性。

如何在Mongoid中实现它?

1 个答案:

答案 0 :(得分:1)

尝试this article中提供的解决方案。定义以下模块并将其包含在要禁用单个集合继承的模型中。

module NoHeritage
  extend ActiveSupport::Concern

  included do
    # Internal: Preserve the default storage options instead of storing in the
    # same collection than the superclass.
    delegate :storage_options, to: :class
  end

  module ClassMethods
    # Internal: Prevent adding _type in query selectors, and adding an index
    # for _type.
    def hereditary?
      false
    end

    # Internal: Prevent Mongoid from defining a _type getter and setter.
    def field(name, options = {})
      super unless name.to_sym == :_type
    end

    # Internal: Preserve the default storage options instead of storing in the
    # same collection than the superclass.
    def inherited(subclass)
      super

      def subclass.storage_options
        @storage_options ||= storage_options_defaults
      end
    end
  end
end

这篇文章是从2015年开始的,因此Mongoid可能会有一些变化,所以你可能需要稍微调整一下这个解决方案。但无论如何它应该给你一个良好的开端。