2013-04-28 68 views
5

我正在使用mongoid和rails 3,并且最近遇到了一个非常棘手的问题 ,我需要一个建议。ActiveSupport ::关注并扩展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没有 较长时间支持此行为,并且数据始终保存为dc_pages 集合。

在解释我的问题时,mongoid团队建议我使用ActiveSupport :: Concern 并为我提供了一个示例。如果扩展类在相同的源文件中定义,那么它的工作原理 完全可以。其中 btw。从不在实践中发生。

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

你现在可以看到我的痛苦了吗?基本的源文件当然会支持到 宝石,并因此成为一个移动的目标。

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

通过 疗法

+1

您是否将通用功能直接添加到宝石来源?你想改变哪一堂课? – Chris 2013-04-28 18:22:47

+0

我假设CommonBehaviour modul和DcPage类在gem文件中包含的同一源文件../app/models/dc_page.rb中。 MyPage类在当前应用程序中定义为../app/models/my_page.rb,它将扩展DcPage类。在这种情况下,它包含了包含在这两个类中的CommonBehaviur模块。 – 2013-04-29 05:36:34

+0

你有没有找到更好的解决方案呢?我有同样的问题。 – 2013-05-23 16:13:33

回答

1

的原因,这并不工作,因为这是单表继承模式。 您需要关闭表继承为了这个工作。

但是,来自mongoid开发人员的建议是这种情况下的正确途径。 它看起来像你只需要正确地要求你的模块/类。