2011-06-02 40 views
1

爲了保持乾燥,我有一個類模型庫,包括Mongoid文件如下:Mongoid和carrierwave

class ModelBase 
    include Mongoid::Document 

    alias_attribute :guid, :id 

    def as_json(options = {}) 
    azove_hash = options.merge(:methods => :guid) 
    super azove_hash 
    end 
end 

然後我所有的車型從模型庫繼承,他們似乎是工作的罰款。但是,我有一個使用CarrierWave的模型。當它從ModelBase繼承時,對mount_uploader的調用失敗。當我把模型包含進去而沒有子類時,它可以正常工作。在另一個類繼承的類中使用carrierwave不可能嗎?

這是失敗類的版本。將不勝感激任何建議/想法

require 'carrierwave/orm/mongoid' 

class SomeOtherModel < ModelBase 
    field :abstract 
    validates :abstract, :presence => true 

    field :category 
    validates :category, :presence => true, :inclusion => {:in => %w{audio graphics text video}} 

    field :content_uri 
    validates :content_uri, :presence => true 

    has_and_belongs_to_many :topics 
    has_and_belongs_to_many :events 
    has_and_belongs_to_many :authors, :class_name => "User" 

    mount_uploader :content, ContentUploader 

    attr_accessible :abstract, :category, :content, :content_uri, :authors, :topics, :events 
end 

回答

1

我認爲你讓事情太複雜。我發現不需要從mongoid文檔繼承modelbase。 Mongoid本身不使用繼承,只是根據需要包含模塊。

所以,如果你有一組字段重複使用,聯繫方式等資料的,只是這樣做:

class Customer 
    include Mongoid::Document 
    include DataModules::ContactDocument 
    mounts_uploader :logo, LogoUploader 
end 

class User 
    inclue Mongoid::Document 
    include DataModules::ContactDocument 
end 

然後包括你想在/ lib/data_modules/contact_document重用的代碼。 rb

module DataModules::ContactDocument 

    def self.included(receiver) 
    receiver.class_eval do 
     field :email, :type=>String 
     ... 
     validates_existence_of :email 
    end 
    end 
end 
+0

傑西,謝謝你的回覆。其實,我並沒有試圖分享領域。我試圖重用我需要的as_json方法,因爲我在前端使用Sproutcore,這需要使用json格式進行數據通信。所以,我想在一個類中移動該方法,並儘可能在所有模型中重用該方法。但是,當我使用這個特定的類時,它會拋出一個錯誤:關於mount_uploader – joque 2011-06-03 13:12:48

+0

的方法錯誤沒有使用as_json方法的方法。不要使用繼承 – 2011-06-03 13:38:02