【问题标题】:Save inherited object to separate collection in Mongoid将继承的对象保存到 Mongoid 中的单独集合
【发布时间】:2012-04-01 05:32:38
【问题描述】:

我阅读了 mongoid 中的继承,似乎所有继承的类都将保存在基类中,例如

class BaseClass
end

class ChildClass1 < BaseClass
end

class ChildClass2 < BaseClass
end

似乎所有这些都存储在 BaseClass 集合中。

我实际上希望它们存储在单独的集合中,例如ChildClass1 - collectionChildClass2 - collection

【问题讨论】:

  • 根据this 问题的讨论,我认为没有办法将子类存储在单独的集合中。正如 durran 在本期中建议的那样,您可以使用 mixins 而不是继承。
  • 使用这个有什么问题吗:self.collection_name = "account"?显然我的目标是保持我的收藏量很小。这是个好主意吗?
  • 我在这里找到了很好的答案stackoverflow.com/questions/10704310/…

标签: ruby-on-rails inheritance mongodb collections mongoid


【解决方案1】:

我遇到了同样的问题,并没有在网上找到好的解决方案。 经过几次尝试,我制定了一个解决方案:

class A
  include Mongoid::Document
  include Mongoid::Timestamps
  ...
end


class B < A
  def self.collection_name
    :your_collection_name_1
  end
  ...
end


class C < A
  def self.collection_name
    :your_collection_name_2
  end 
  ...
end

在访问 mongo 集合之前,mongoid 从 'collection_name' 方法获取集合名称。

这样,我重写了mongoid类的方法'collection_name',它返回集合名称(而不是带有's'的基类名称:'As')

因此,来自 B 类的所有写入(或读取)命令都将插入(选择)到“your_collection_name_1”集合中,而 C 类将插入(选择)到“your_collection_name_2”集合中。

【讨论】:

    【解决方案2】:

    请尝试这种方法:

    module Base
      extend ActiveSupport::Concern
    
      include Mongoid::Document
      include Mongoid::Timestamps
    
      included do
        # Common code goes here.
      end
    end
    
    class ChildClass1
      include Base
    end
    
    class ChildClass2
      include Base
    end
    

    我在我的 Rails 5 应用程序中执行此操作,它确实有效。

    【讨论】:

    • 正是我想要的。在非 Rails 应用程序中测试/工作
    【解决方案3】:

    我知道这是一年前发布的,但这可能是您想要的:

    class BaseClass
      include Mongoid::Document
      def self.inherited(subclass)
        super
        subclass.store_in subclass.to_s.tableize
      end
    end
    
    class ChildClass1 < BaseClass
    end
    
    class ChildClass2 < BaseClass
    end
    

    【讨论】:

      【解决方案4】:

      这是不可能的。因为它是 Mongoid 中 STI 的概念,例如 explain by Durran the Mongoid creator

      如果你真的想保存在几个集合中,你需要使用模块包括:

      class BaseClass
        include MyModule
      end
      
      class ChildClass1
        include MyModule
      end
      
      class ChildClass2
        include MyModule
      end
      

      【讨论】:

      • 谢谢,这是很好的输入。那这个呢? self.collection_name = "帐户"?有什么问题吗?
      • 你需要使用类方法store_in来定义你想要保存你的对象的集合
      猜你喜欢
      • 1970-01-01
      • 2019-10-06
      • 2011-10-05
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      相关资源
      最近更新 更多