将继承的对象保存到Mongoid中的单独集合中

时间:2012-03-15 16:47:15

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

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

class BaseClass
end

class ChildClass1 < BaseClass
end

class ChildClass2 < BaseClass
end

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

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

4 个答案:

答案 0 :(得分:4)

我意识到这是一年前发布的,但这可能就是你想要的:

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

答案 1 :(得分:3)

这是不可能的。因为它是像explain by Durran the Mongoid creator

这样的STI In Mongoid的概念

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

class BaseClass
  include MyModule
end

class ChildClass1
  include MyModule
end

class ChildClass2
  include MyModule
end

答案 2 :(得分:3)

请尝试这种方法:

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应用程序中执行此操作,它确实有效。

答案 3 :(得分:3)

我遇到了同样的问题,但是在网上找不到一个好的解决方案。 经过几次尝试,我开发了一个解决方案:

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”集合中。