1

DRY のままにするために、次のように 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 を使用しているモデルが 1 つあります。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
4

1 に答える 1

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
于 2011-06-02T13:53:05.413 に答える