Sha256: dbea374bb4f9808fd6545c0b684971a971d812b58e037a916fe362ec504af72b

Contents?: true

Size: 1.58 KB

Versions: 1

Compression:

Stored size: 1.58 KB

Contents

require 'active_record'
require 'active_record/validations'
require 'much-plugin'
require 'mr/model/configuration'

module MR; end
module MR::Model

  module Persistence
    include MuchPlugin

    plugin_included do
      include MR::Model::Configuration
      extend ClassMethods
      include InstanceMethods
    end

    module ClassMethods

      def transaction(&block)
        self.record_class.transaction(&block)
      end

    end

    module InstanceMethods

      def save
        self.transaction{ record.save! }
      rescue ActiveRecord::RecordInvalid => exception
        # `caller` is not consistent between 1.8 and 2.0, if we stop supporting
        # older versions, we can switch to using `caller`
        called_from = exception.backtrace[6..-1]
        raise InvalidError.new(self, self.errors, called_from)
      end

      def destroy
        record.destroy
      end

      def transaction(&block)
        record.transaction(&block)
      end

      def errors
        record.errors.messages
      end

      def valid?
        record.valid?
      end

      def new?
        record.new_record?
      end

      def destroyed?
        record.destroyed?
      end

    end

  end

  class InvalidError < RuntimeError
    attr_reader :errors

    def initialize(model, errors, backtrace = nil)
      @errors = errors || {}
      desc = @errors.map do |(attribute, messages)|
        messages.map{ |message| "#{attribute.inspect} #{message}" }
      end.sort.join(', ')
      super "Invalid #{model.class} couldn't be saved: #{desc}"
      set_backtrace(backtrace) if backtrace
    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mr-0.35.2 lib/mr/model/persistence.rb