Сохранить унаследованный объект в отдельную коллекцию в Mongoid - PullRequest
8 голосов
/ 15 марта 2012

Я прочитал до наследования в mongoid, и кажется, что все унаследованные классы будут сохранены в базовом классе, например,

class BaseClass
end

class ChildClass1 < BaseClass
end

class ChildClass2 < BaseClass
end

Кажется, что все они хранятся в коллекции BaseClass.* Я действительно хочу, чтобы они хранились в отдельных коллекциях, например ChildClass1 - collection и ChildClass2 - collection.

Ответы [ 4 ]

4 голосов
/ 20 февраля 2014

Я понимаю, что это было опубликовано год назад, но это может быть то, что вы искали:

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
3 голосов
/ 29 августа 2018

Я столкнулся с той же проблемой и не нашел хорошего решения в сети. После нескольких попыток я разработал решение:

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.

Таким образом, я переопределяю метод 'collection_name' класса mongoid, который возвращает имя коллекции (вместо имени базового класса с помощью 's': 'As')

Итак, все команды записи (или чтения) из класса B будут вставлены (выбраны) в коллекцию 'your_collection_name_1', а класс C будет вставлен в коллекцию 'your_collection_name_2'.

3 голосов
/ 17 мая 2017

Пожалуйста, попробуйте этот подход:

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, и оно точно работает.

3 голосов
/ 16 марта 2012

Это невозможно сделать. Потому что это концепция STI In Mongoid, подобная , объясненной Дурраном, создателем Mongoid

Если вы действительно хотите сохранить в нескольких коллекциях, вам нужно использовать модуль, например:

class BaseClass
  include MyModule
end

class ChildClass1
  include MyModule
end

class ChildClass2
  include MyModule
end
...