Монгоид и несущая волна - PullRequest
1 голос
/ 02 июня 2011

Чтобы остаться СУХИМ, у меня есть класс ModelBase, который включает в себя Mongoid документ следующим образом:

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

1 Ответ

1 голос
/ 02 июня 2011

Я думаю, вы делаете вещи слишком сложными.Я не вижу необходимости наследовать от модельной базы с документом mongoid.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
...