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

0lvr5msh  于 4个月前  发布在  Ruby
关注(0)|答案(5)|浏览(73)

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

class BaseClass
end

class ChildClass1 < BaseClass
end

class ChildClass2 < BaseClass
end

字符串
似乎所有这些都存储在BaseClass集合中。
我实际上希望它们存储在单独的集合中,例如ChildClass1 - collectionChildClass2 - collection

pu3pd22g

pu3pd22g1#

我知道这是一年前发布的,但这可能是你要找的:

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

字符串

mv1qrgav

mv1qrgav2#

请尝试这种方法:

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

rxztt3cl

rxztt3cl3#

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

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

8hhllhi2

8hhllhi24#

这是不可能的。因为这是Mongoid中STI的概念,就像Mongoid的创建者Durran解释的那样
如果你真的想保存在几个集合中,你需要使用模块包括:

class BaseClass
  include MyModule
end

class ChildClass1
  include MyModule
end

class ChildClass2
  include MyModule
end

字符串

68de4m5k

68de4m5k5#

从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

相关问题