5

我正在使用带有 rails 3 的 mongoid,最近遇到了一个非常棘手的问题,我需要一个建议。

我正在研究 CMS,其中一个想法是 CMS 将提供一些基本模型定义,最终用户将在需要时使用自己的定义和控件扩展基本类,并将它们保存在不同的集合(表)中。

class DcPage
  include Mongoid::Document

  field a ....
  belongs_to b ....
  validates a ....
end

class MyPage < DcPage
  field c ....
  validates c ....
end

直到最后一个版本的 mongoid 这工作(几乎没有 hack)并且数据将被保存到 my_pages 集合。由于一些问题,mongoid 不再支持这种行为,并且数据总是被保存到 dc_pages 集合中。

在解释我的问题时,mongoid 团队建议我使用 ActiveSupport::Concern 并为我提供了一个示例。如果在同一个源文件中定义了扩展类,那么它工作得很好。顺便说一句。在实践中永远不会发生。

module CommonBehaviour
  extend ActiveSupport::Concern

  included do
    field :subject, type: String, default: ''
    # ...
  end
end

class DcPage
  include Mongoid::Document
  include CommonBehaviour
end

class MyPage
  include Mongoid::Document
  include CommonBehaviour
end

到目前为止,我发现如果我在第二个文件中需要基本源文件,它就可以工作。看起来像这样: require '/some/path/to/my/gem/app/models/dc_page.rb

你现在能看到我的痛苦吗?基本源文件当然会被备份到 gem 中,因此成为一个移动目标。

请帮助我更好的解决方案。

由 TheR

4

1 回答 1

1

这不起作用的原因是因为这是单表继承的模式。您需要关闭表继承才能使其正常工作。

但是,在这种情况下,mongoid 开发人员的建议是正确的路线。看起来您只需要正确地要求您的模块/类。

于 2013-04-28T18:38:01.597 回答