#ruby-on-rails #mongodb #polymorphism #mongoid #database-schema
#ruby-on-rails #mongodb #полиморфизм #mongoid #база данных-схема
Вопрос:
Возможно ли получить реальный полиморфизм в Mongoid?
Пример:
class Company
include Mongoid::Document
has_many :workers, as: :workable
end
class Worker
include Mongoid::Document
field :hours
belongs_to :workable, polymorphic: true
end
class Manager < Worker
field :order
has_many :contributors
end
class Contributor < Worker
field :task
end
Проблема в том, что он проходит через суперкласс worker, чтобы попытаться определить тип документов, на которые ссылаются. Это означает, что, хотя ЧАСАМИ можно манипулировать, поля, принадлежащие подклассам, не могут нравиться УЧАСТНИКАМ, ЗАКАЗ, ЗАДАЧА не могут. Есть ли способ сделать это действительно полиморфным?
И чтобы уточнить, когда я говорю «истинно полиморфный», я имею в виду, возможно ли использовать объекты в качестве рабочих и определять, к какому типу они относятся позже, чтобы можно было установить их конкретные поля. Таким образом, у меня есть возможность перебирать всех работников, а также возможность устанавливать конкретные поля работника, такие как order и task, при создании участника или менеджера.
Кроме того, если полиморфизм выполним, как будут выглядеть контроллер и представление, которые заполняют поля менеджера и участника в компании?
Спасибо
Комментарии:
1. как насчет коллекции задач?
2. коллекции задач и участников в примере не имеют значения. Я вставил их, чтобы завершить пример. Просто представьте, что у них есть поля, отличные от worker
Ответ №1:
У меня была похожая проблема раньше.. Вам нужно будет поискать в Google «Mongoid Inheritance» и «Mongoid Self referential relationship» — смотрите также:
Mongoid 3 (текущий)
- http://mongoid.org/en/mongoid/docs/documents.html#inheritance
- http://mongoid.org/en/mongoid/docs/relations.html#has_many
Mongoid 2
- http://two.mongoid.org/docs/documents/inheritance.html
- http://two.mongoid.org/docs/relations/referenced/1-n.html
В Mongoid также есть концепция «наследования» .. с помощью которой вы можете моделировать расширение поведения классов, таких как Manager < Worker и Contributer < Worker в вашем примере — все три класса хранятся в коллекции «Worker».
Возможно, вы также захотите взглянуть на драгоценный камень «ancestry».
попробуйте:
class Company
include Mongoid::Document
has_many :workers
end
class Worker
include Mongoid::Document
field :hours
belongs_to :company
end
class Manager < Worker
field :order
references_many :contributors, :class_name => "Worker"
end
class Contributor < Worker
field :task
belongs_to_related :manager, :class_name => "Worker"
end
Комментарии:
1. Спасибо, что работает … мой следующий вопрос: как нам заполнить это, используя вложенные атрибуты в форме. Это еще один пост, хотя
2. можете ли вы опубликовать это как отдельный вопрос?