【问题标题】:Polymorphism in MongoidMongoid中的多态性
【发布时间】:2011-11-29 11:58:16
【问题描述】:

在 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

这样做的问题是它通过工人超类来试图找出引用的文档类型。这意味着虽然 HOURS 可以操作,但属于子类的字段不能像 CONTRIBUTORS、ORDER、TASK 一样。有没有办法让这个真正多态?

当我说真正的多态时,详细说明一下,我的意思是可以将对象作为工作人员并在以后确定它们的类型,以便可以设置它们的特定字段。所以我有能力遍历所有的工人,也有能力在构造 Contributor 或 Manager 时设置工人的特定字段,例如 order 和 task。

另外,如果多态是可行的,那么控制器和视图在公司中填写经理和贡献者的字段会是什么样子?

谢谢

【问题讨论】:

  • 任务集合呢?
  • 任务和贡献者集合在示例中无关紧要。我把它们放进去完成这个例子。假装他们有与工人不同的领域

标签: ruby-on-rails mongodb polymorphism mongoid database-schema


【解决方案1】:

我之前也遇到过类似的问题。您需要在 Google 上搜索“Mongoid 继承”和“Mongoid 自引用关系”——另请参阅:

Mongoid 3(当前)

Mongoid 2

Mongoid 也有“继承”的概念 .. 使用它您可以模拟扩展类的行为,例如您的示例中的 Manager

您可能还想查看“祖先”宝石。

尝试:

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

【讨论】:

  • 谢谢它的工作......我的下一个问题是我们如何使用表单中的嵌套属性来填写它。这是另一篇文章
  • 你能把这个作为一个单独的问题发布吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多