Монгоид и несущая волна

Чтобы остаться СУХИМ, у меня есть класс 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 ответ

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