Polymorphism in Mongoid
Is it possible to get real polymorphism in Mongoid?
Example:
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
The problem with this is it goes through the worker superclass to try to figure out the referenced documents type. W开发者_如何转开发hich means that while HOURS can be manipulated, the fields that belong to the subclasses cannot like CONTRIBUTORS, ORDER, TASK cannot. Is there a way to make this truely polymorphic?
And to elaborate when I say truely polymorphic, I mean is it possible to have the objects as workers and determine which type they are at a later time so their specific fields can be set. So I have the ability to loop over all workers but also the ability to set the worker's specific fields such as order and task when the Contributor or Manager is constructed.
Also if polymorphism is doable, what would a controller and view look like that fills out a Manager and Contributor's fields in the company?
Thanks
I had a similar problem before.. You'll need to google for "Mongoid Inheritance" and "Mongoid Self referential relationship" -- see also:
Mongoid 3 (current)
- 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 also has the concept of "Inheritance" .. with which you can model extending the behavior of classes , like Manager < Worker , and Contributer < Worker in your example -- all three Classes are stored in the "Worker" collection.
You might also want to look at the "ancestry" Gem.
try:
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
精彩评论