Ruby on rails 将继承的对象保存到Mongoid中的单独集合
我阅读了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
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应用程序中测试/工作