【问题标题】:ActiveSupport::Concern and extending mongoid modelActiveSupport::关注和扩展mongoid模型
【发布时间】:2013-04-28 18:18:03
【问题描述】:

我正在使用带有 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 这工作(很少破解)和数据 将被保存到 my_pages 集合。由于一些问题,mongoid no 不再支持此行为,并且数据始终保存到 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

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

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

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

通过 该R

【问题讨论】:

  • 您是否将常用功能直接添加到 gem 源中?你想改变哪个类?
  • 我假设 CommonBehaviour 模块和 DcPage 类位于同一个源文件 ../app/models/dc_page.rb 中,该源文件包含在 gem 文件中。 MyPage 类在当前应用程序中定义为 ../app/models/my_page.rb ,它将扩展 DcPage 类。在这种情况下,它包括两个类中都包含的 CommonBehaviur 模块。
  • 您有没有找到更好的解决方案?我有同样的问题。

标签: ruby-on-rails model mongoid extending


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2013-02-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多