我阅读了 mongoid 中的继承,似乎所有继承的类都会保存在基类中,例如
class BaseClass
end
class ChildClass1 < BaseClass
end
class ChildClass2 < BaseClass
end
似乎所有这些都存储在 BaseClass 集合中。
我实际上希望它们存储在单独的集合中,例如
ChildClass1 - collection
和 ChildClass2 - collection
。
我意识到这是一年前发布的,但这可能就是您正在寻找的:
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
请尝试这个方法:
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 应用程序中执行此操作,并且它确实有效。
我遇到了同样的问题,在网上没有找到好的解决方案。 经过几次尝试,我制定了一个解决方案:
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”集合中。
这是不可能的。因为这是 Mongoid 中 STI 的概念,就像 Mongoid 创造者 Durran 的解释
如果你真的想保存在多个集合中,你需要使用模块包括:
class BaseClass
include MyModule
end
class ChildClass1
include MyModule
end
class ChildClass2
include MyModule
end
从 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