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

问题描述 投票:0回答:5

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

class BaseClass
end

class ChildClass1 < BaseClass
end

class ChildClass2 < BaseClass
end

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

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

ChildClass1 - collection
ChildClass2 - collection

ruby-on-rails inheritance mongodb collections mongoid
5个回答
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

4
投票

请尝试这个方法:

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


4
投票

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

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


3
投票

这是不可能的。因为这是 Mongoid 中 STI 的概念,就像 Mongoid 创造者 Durran 的解释

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

class BaseClass
  include MyModule
end

class ChildClass1
  include MyModule
end

class ChildClass2
  include MyModule
end

0
投票

从 Mongoid v8.1 开始(也可能是 v8.0,尚未在该版本中测试过),您可以使用

store_in collection: "collection_name"
来实现此目的。

class Shape
  include Mongoid::Document
  store_in collection: :shapes
end

class Circle < Shape
  store_in collection: :circles
end

这将创建 2 个不同集合(形状和圆形)中的文档。

参考:https://www.mongodb.com/docs/mongoid/current/reference/inheritance/#persistence-contexts

© www.soinside.com 2019 - 2024. All rights reserved.