Sha256: ede2a692bec51fc2f8c682f404d13edf0d214a79ce640851fabd0423ba07058b

Contents?: true

Size: 1.34 KB

Versions: 4

Compression:

Stored size: 1.34 KB

Contents

module Joint
  module ClassMethods
    def attachment_accessor_module
      @attachment_accessor_module ||= Module.new
    end

    def attachment(name, options = {})
      options.symbolize_keys!
      name = name.to_sym

      self.attachment_names << name

      after_save     :save_attachments
      after_save     :destroy_nil_attachments
      before_destroy :destroy_all_attachments

      key :"#{name}_id",   ObjectId
      key :"#{name}_name", String
      key :"#{name}_size", Integer
      key :"#{name}_type", String

      validates_presence_of(name) if options[:required]

      attachment_accessor_module.module_eval <<-EOC
        def #{name}
          @#{name} ||= AttachmentProxy.new(self, :#{name})
        end

        def #{name}?
          !nil_attachments.include?(:#{name}) && send(:#{name}_id?)
        end

        def #{name}=(file)
          if file.nil?
            nil_attachments << :#{name}
            assigned_attachments.delete(:#{name})
          else
            send("#{name}_id=", BSON::ObjectId.new) if send("#{name}_id").nil?
            send("#{name}_name=", Joint.name(file))
            send("#{name}_size=", Joint.size(file))
            send("#{name}_type=", Joint.type(file))
            assigned_attachments[:#{name}] = file
            nil_attachments.delete(:#{name})
          end
        end
      EOC
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
joint-0.5.5 lib/joint/class_methods.rb
joint-0.5.4 lib/joint/class_methods.rb
joint-0.5.3 lib/joint/class_methods.rb
joint-0.5.2 lib/joint/class_methods.rb