ruby-on-rails - Mongoid 中的多态性

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

是否有可能在 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 父类(super class)来尝试找出引用的文档类型。这意味着虽然可以操纵 HOURS,但属于子类的字段不能像 CONTRIBUTORS、ORDER、TASK 那样。有没有办法让这个真正多态?

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

此外,如果多态是可行的,填充公司中经理和贡献者字段的 Controller 和 View 会是什么样子?

谢谢

最佳答案

我以前遇到过类似的问题。您需要在谷歌上搜索“Mongoid Inheritance”和“Mongoid Self referential relationship”——另请参阅:

Mongoid 3(当前)

半人半兽 2

Mongoid 也有“继承”的概念。您可以用它来模拟扩展类的行为,例如您的示例中的 Manager < Worker 和 Contributer < Worker —— 所有三个类都存储在“Worker”集合中.

您可能还想看看“祖先” gem 。

尝试:

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

关于ruby-on-rails - Mongoid 中的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7628135/

相关文章:

node.js - 错误:Can't canonicalize query: BadValue Unsupported projection option

database - Mongo 服务器未通过 cmd mongod --dbpath/Users/mayankpatel/data/db 启动

mysql - Laravel 多态关系中的 FK

C# 不是可分配类型 - 泛型

java - Java中如何通过参数选择实现

ruby-on-rails - 如何使用 rails sunspot 在 solr 中加入模型

mysql - 为什么数据库迁移过程中gemfile中找不到mysql gem?

MongoDB/Morphia - 删除行为不正常的对象,我错过了什么?

ruby-on-rails - 如何在 Ruby on Rails 应用程序中为 SSL 客户端配置私钥

ruby-on-rails - 在 rails 中为 has_many 关系指定默认记录的最佳方法