Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Aug 3rd, 2012  |  syntax: None  |  size: 1.42 KB  |  hits: 12  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. module Versionable
  2.   extend ActiveSupport::Concern
  3.  
  4.   BASE_VERSION = 1
  5.   VERSION_PROPERTY_NAME = 'schema_version'
  6.  
  7.   included do
  8.     property VERSION_PROPERTY_NAME.to_sym, Integer, numericality: { greater_than_or_equal_to: 0 }, default: lambda { current_schema_version }
  9.     extend (embeddable? ? EmbeddedDocument : Document)
  10.   end
  11.  
  12.   module ClassMethods
  13.     attr_accessor :migrate_schema_block
  14.     def migrate_schema(&block)
  15.       self.migrate_schema_block = block
  16.     end
  17.  
  18.     def current_schema_version(version = nil)
  19.       if version
  20.         @_current_schema_version = version
  21.       else
  22.         @_current_schema_version or raise "current_schema_version is not set"
  23.       end
  24.     end
  25.  
  26.   private
  27.  
  28.     def instantiate(robject_or_hash, data)
  29.       super(robject_or_hash).tap do |document|
  30.         if document.schema_version < current_schema_version && migrate_schema_block
  31.           document.instance_exec(data, &migrate_schema_block)
  32.         elsif document.schema_version > current_schema_version
  33.           raise "Cannot migrate #{self} from version #{document.schema_version} to #{current_schema_version}"
  34.         end
  35.       end
  36.     end
  37.   end
  38.  
  39.   module Document
  40.     private
  41.     def instantiate(robject)
  42.       robject.data[VERSION_PROPERTY_NAME] ||= BASE_VERSION
  43.       super(robject, robject.data)
  44.     end
  45.   end
  46.  
  47.   module EmbeddedDocument
  48.     def instantiate(hash)
  49.       hash[VERSION_PROPERTY_NAME] ||= BASE_VERSION
  50.       super(hash, hash)
  51.     end
  52.   end
  53. end