ActiveSupport ::关注和扩展mongoid模型

Dam*_*ems 5 model ruby-on-rails extending mongoid

我正在使用mongoid和rails 3,并且最近遇到了一个非常棘手的问题,我需要一个建议.

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

class DcPage
  include Mongoid::Document

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

class MyPage < DcPage
  field c ....
  validates c ....
end
Run Code Online (Sandbox Code Playgroud)

直到最后一个版本的mongoid这个工作(很少黑客),数据将保存到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
Run Code Online (Sandbox Code Playgroud)

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

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

请帮我更好的解决方案.

由TheR

cpu*_*y83 1

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

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