module VersionedRecord

Constants

VERSION

Public Class Methods

included(model_class) click to toggle source
# File lib/versioned_record.rb, line 17
def self.included(model_class)
  model_class.primary_keys = :id, :version
  model_class.after_save :ensure_version_deprecation!, on: :create
  model_class.extend ClassMethods
  model_class.include InstanceMethods
end

Public Instance Methods

deprecate_old_versions_after_create?() click to toggle source
# File lib/versioned_record.rb, line 119
def deprecate_old_versions_after_create?
  @deprecate_old_versions_after_create
end
ensure_version_deprecation!() click to toggle source
# File lib/versioned_record.rb, line 123
def ensure_version_deprecation!
  if deprecate_old_versions_after_create?
    deprecate_old_versions(self)
  end
end
preserve_has_one_associations_to(new_version) click to toggle source

This is required because a new version which has not been persisted to the database breaks the normal ActiveRecord paradigm. Because normally when a record has not yet been persisted it can have no persisted has_one associations because there is no foriegn key. In our case we have a foreign key because it was determined from the previous version.

This doesn't apply to composite has_one associations because they will use a different foreign key to the parent version.

# File lib/versioned_record.rb, line 139
def preserve_has_one_associations_to(new_version)
  # Preserve simple has_one reflections
  self.class.reflections.select { |_, reflection|
    reflection.macro == :has_one
  }.each do |key, reflection|
    if !reflection.foreign_key.kind_of?(Array)
      new_version.send("#{key}=", self.send(key))
    end
  end
end