Module: ExpectedBehavior::ActsAsArchival::InstanceMethods

Defined in:
lib/expected_behavior/acts_as_archival.rb

Instance Method Summary collapse

Instance Method Details

#archive(head_archive_number = nil) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/expected_behavior/acts_as_archival.rb', line 69

def archive(head_archive_number=nil)
  self.class.transaction do
    begin
      success = run_callbacks(:archive) do
        unless self.archived?
          head_archive_number ||= Digest::MD5.hexdigest("#{self.class.name}#{self.id}")
          self.archive_associations(head_archive_number)
          self.archived_at = DateTime.now
          self.archive_number = head_archive_number
          self.save!
        end
      end
      return !!success
    rescue => e
      ActiveRecord::Base.logger.try(:debug, e.message)
      ActiveRecord::Base.logger.try(:debug, e.backtrace)
      raise ActiveRecord::Rollback
    end
  end
  false
end

#archive_associations(head_archive_number) ⇒ Object



113
114
115
# File 'lib/expected_behavior/acts_as_archival.rb', line 113

def archive_associations(head_archive_number)
  AssociationOperation::Archive.new(self, head_archive_number).execute
end

#archived?Boolean

Returns:

  • (Boolean)


65
66
67
# File 'lib/expected_behavior/acts_as_archival.rb', line 65

def archived?
  !!(self.archived_at? && self.archive_number)
end

#raise_if_not_archivalObject



58
59
60
61
62
63
# File 'lib/expected_behavior/acts_as_archival.rb', line 58

def raise_if_not_archival
  missing_columns = []
  missing_columns << "archive_number" unless self.respond_to?(:archive_number)
  missing_columns << "archived_at" unless self.respond_to?(:archived_at)
  raise MissingArchivalColumnError.new("Add '#{missing_columns.join "', '"}' column(s) to '#{self.class.name}' to make it archival") unless missing_columns.blank?
end

#readonly_when_archivedObject



52
53
54
55
56
# File 'lib/expected_behavior/acts_as_archival.rb', line 52

def readonly_when_archived
  if self.archived? && self.changed? && !self.archived_at_changed? && !self.archive_number_changed?
    self.errors.add(:base, "Cannot modify an archived record.")
  end
end

#unarchive(head_archive_number = nil) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/expected_behavior/acts_as_archival.rb', line 91

def unarchive(head_archive_number=nil)
  self.class.transaction do
    begin
      success = run_callbacks(:unarchive) do
        if self.archived?
          head_archive_number ||= self.archive_number
          self.archived_at = nil
          self.archive_number = nil
          self.save!
          self.unarchive_associations(head_archive_number)
        end
      end
      return !!success
    rescue => e
      ActiveRecord::Base.logger.try(:debug, e.message)
      ActiveRecord::Base.logger.try(:debug, e.backtrace)
      raise ActiveRecord::Rollback
    end
  end
  false
end

#unarchive_associations(head_archive_number) ⇒ Object



117
118
119
# File 'lib/expected_behavior/acts_as_archival.rb', line 117

def unarchive_associations(head_archive_number)
  AssociationOperation::Unarchive.new(self, head_archive_number).execute
end