我正在使用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
你现在可以看到我的痛苦了吗?基本的源文件当然会支持到 宝石,并因此成为一个移动的目标。
请帮助我更好的解决方案。
通过 疗法
您是否将通用功能直接添加到宝石来源?你想改变哪一堂课? – Chris 2013-04-28 18:22:47
我假设CommonBehaviour modul和DcPage类在gem文件中包含的同一源文件../app/models/dc_page.rb中。 MyPage类在当前应用程序中定义为../app/models/my_page.rb,它将扩展DcPage类。在这种情况下,它包含了包含在这两个类中的CommonBehaviur模块。 – 2013-04-29 05:36:34
你有没有找到更好的解决方案呢?我有同样的问题。 – 2013-05-23 16:13:33