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

Ruby on rails 将继承的对象保存到Mongoid中的单独集合,ruby-on-rails,inheritance,mongodb,collections,mongoid,Ruby On Rails,Inheritance,Mongodb,Collections,Mongoid,我阅读了mongoid中的继承,似乎所有继承的类都将保存在基类中,例如 class BaseClass end class ChildClass1 < BaseClass end class ChildClass2 < BaseClass end 类基类 结束 类ChildClass1

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

class BaseClass
end

class ChildClass1 < BaseClass
end

class ChildClass2 < BaseClass
end
类基类
结束
类ChildClass1<基类
结束
类ChildClass2<基类
结束
似乎所有这些都存储在基类集合中


实际上,我希望它们存储在单独的集合中,例如
ChildClass1-collection
ChildClass2-collection
这是不可能的。因为这是Mongoid中STI的概念

如果您确实希望保存在多个集合中,则需要使用模块include,如:

class BaseClass
  include MyModule
end

class ChildClass1
  include MyModule
end

class ChildClass2
  include MyModule
end

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

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
类基类
include Mongoid::Document
def self.inherited(子类)
超级的
subclass.store_在subclass.to_.tableize中
结束
结束
类ChildClass1<基类
结束
类ChildClass2<基类
结束

请尝试以下方法:

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应用程序中这样做,它肯定能工作。

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

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
A类
include Mongoid::Document
包含Mongoid::时间戳
...
结束
B类
在访问mongo集合之前,mongoid从“collection\u name”方法获取集合名称

这样,我重写了mongoid类的方法“collection\u name”,该方法返回集合名称(而不是带有“s”:“As”的基类名称)


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

根据对该问题的讨论,我假设无法在单独的集合中存储子类。正如durran在本期文章中建议的那样,您可以使用mixin而不是继承。使用self.collection\u name=“account”有问题吗?显然,我的目标是保持我的收藏量小。这是个好主意吗?我在这里找到了很好的答案谢谢,这是很好的输入。这个怎么样?self.collection\u name=“账户”?有什么问题吗?您需要使用class方法
store\u in
来定义要在哪个集合中保存您的对象,这正是我要查找的。在非rails应用程序中测试/工作