Ruby on rails Mongoid和carrierwave

Ruby on rails Mongoid和carrierwave,ruby-on-rails,mongoid,carrierwave,Ruby On Rails,Mongoid,Carrierwave,为了保持干燥,我有一个包含Mongoid文档的类ModelBase,如下所示: class ModelBase include Mongoid::Document alias_attribute :guid, :id def as_json(options = {}) azove_hash = options.merge(:methods => :guid) super azove_hash end end 然后,我所有的模型都继承自ModelBase

为了保持干燥,我有一个包含Mongoid文档的类ModelBase,如下所示:

class ModelBase
  include Mongoid::Document

  alias_attribute :guid, :id

  def as_json(options = {})
    azove_hash = options.merge(:methods => :guid)
    super azove_hash
  end
end
然后,我所有的模型都继承自ModelBase,它们似乎工作得很好。然而,有一个模型我使用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
需要“carrierwave/orm/mongoid”
类SomeOtherModeltrue
字段:类别
验证:category,:presence=>true,:inclusion=>{:in=>%w{audio graphics text video}
字段:content\u uri
验证:content\u uri,:presence=>true
_和_属于_很多:主题吗
_和_属于_很多:事件吗
拥有且属于多个作者,:class\u name=>“用户”
装载上传器:内容,内容上传器
属性可访问:摘要,:类别,:内容,:内容uri,:作者,:主题,:事件
结束

我觉得你把事情弄得太复杂了。我认为没有必要使用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\u modules/contact\u document.rb中包含要重用的代码

module DataModules::ContactDocument

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

我觉得你把事情弄得太复杂了。我认为没有必要使用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\u modules/contact\u document.rb中包含要重用的代码

module DataModules::ContactDocument

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

杰西,谢谢你的回复。事实上,我并没有试图共享字段。我试图重用我需要的as_json方法,因为我在前端使用Sproutcore,它需要json格式进行数据通信。所以,我想在类中移动该方法,并在所有模型中尽可能地重用它。但是,当我处理这个特定的类时,它抛出了一个错误:mount_uploader没有方法错误使用我的方法作为as_json方法。不要使用继承Jesse,谢谢你的回复。事实上,我并没有试图共享字段。我试图重用我需要的as_json方法,因为我在前端使用Sproutcore,它需要json格式进行数据通信。所以,我想在类中移动该方法,并在所有模型中尽可能地重用它。但是,当我处理这个特定的类时,它抛出了一个错误:mount_uploader没有方法错误使用我的方法作为as_json方法。不要使用继承