module PaperTrailAssociationTracking::Reifiers::HasAndBelongsToMany

Reify a single HABTM association of `model`. @api private

Public Class Methods

reify(pt_enabled, assoc, model, options, transaction_id) click to toggle source

@api private

# File lib/paper_trail_association_tracking/reifiers/has_and_belongs_to_many.rb, line 10
def reify(pt_enabled, assoc, model, options, transaction_id)
  version_ids = ::PaperTrail::VersionAssociation.
    where("foreign_key_name = ?", assoc.name).
    where("version_id = ?", transaction_id).
    pluck(:foreign_key_id)

  model.send(assoc.name).proxy_association.target =
    version_ids.map do |id|
      if pt_enabled
        version = load_version(assoc, id, transaction_id, options[:version_at])
        if version
          next version.reify(
            options.merge(
              has_many: false,
              has_one: false,
              belongs_to: false,
              has_and_belongs_to_many: false
            )
          )
        end
      end
      assoc.klass.where(assoc.klass.primary_key => id).first
    end
end

Private Class Methods

load_version(assoc, id, transaction_id, version_at) click to toggle source

Given a HABTM association `assoc` and an `id`, return a version record from the point in time identified by `transaction_id` or `version_at`. @api private

# File lib/paper_trail_association_tracking/reifiers/has_and_belongs_to_many.rb, line 40
def load_version(assoc, id, transaction_id, version_at)
  assoc.klass.paper_trail.version_class.
    where("item_type = ?", assoc.klass.base_class.name).
    where("item_id = ?", id).
    where("created_at >= ? OR transaction_id = ?", version_at, transaction_id).
    order("id").
    limit(1).
    first
end