lib/active_archive/base.rb in active_archive-3.0.0 vs lib/active_archive/base.rb in active_archive-4.0.0

- old
+ new

@@ -7,18 +7,18 @@ base.instance_eval { define_model_callbacks(:unarchive) } end def archived? - archivable? ? !!archived_at : destroyed? + archivable? ? !archived_at.nil? : destroyed? end def archivable? respond_to?(:archived_at) end - def destroy(force=nil) + def destroy(force = nil) with_transaction_returning_status do if unarchivable? || should_force_destroy?(force) permanently_delete_records_after { super() } else destroy_with_active_archive(force) @@ -31,13 +31,13 @@ def to_archival I18n.t("active_archive.archival.#{archived? ? :archived : :unarchived}") end - def unarchive(options=nil) + def unarchive(opts = nil) with_transaction_returning_status do - (should_unarchive_parent_first?(options) ? unarchival.reverse : unarchival).each { |r| r.call(options) } + (should_unarchive_parent_first?(opts) ? unarchival.reverse : unarchival).each { |record| record.call(opts) } self end end alias_method(:unarchive!, :unarchive) @@ -51,44 +51,38 @@ end private def attempt_notifying_observers(callback) - notify_observers(callback) - rescue NoMethodError - # RETURN + notify_observers(callback) if respond_to?(:notify_observers) end - def destroy_with_active_archive(force=nil) + def destroy_with_active_archive(force = nil) run_callbacks(:destroy) do - (archived? || new_record?) ? save : set_archived_at(Time.now, force) - true + archived? || new_record? ? save : set_archived_at(Time.now, force) + return(true) end archived? ? self : false end - def get_archived_record + def retrieve_archived_record self.class.unscoped.find(id) end - def get_dependent_records + def retrieve_dependent_records dependent_records = {} self.class.reflections.each do |key, reflection| next unless reflection.options[:dependent] == :destroy - next unless records = send(key) - if records.respond_to? :size - next unless records.size > 0 - else - records = [] << records - end + records = send(key) + next unless records + records.respond_to?(:empty?) ? (next if records.empty?) : (records = [] << records) dependent_record = records.first - next if dependent_record.nil? - dependent_records[dependent_record.class] = records.map(&:id) + dependent_record.nil? ? next : dependent_records[dependent_record.class] = records.map(&:id) end dependent_records end @@ -102,66 +96,73 @@ end end end def permanently_delete_records_after(&block) - dependent_records = get_dependent_records - dependent_results = yield + dependent_records = retrieve_dependent_records + dependent_results = yield(block) permanently_delete_records(dependent_records) if dependent_results - return(dependent_results) + dependent_results end def unarchival [ - ->(validate) { unarchive_destroyed_dependent_records(validate) }, - ->(validate) do + -> (validate) { unarchive_destroyed_dependent_records(validate) }, + lambda do |validate| run_callbacks(:unarchive) do set_archived_at(nil, validate) return(true) end end ] end - def unarchive_destroyed_dependent_records(force = nil) - self.class.reflections.select do |name, reflection| - "destroy" == reflection.options[:dependent].to_s && reflection.klass.archivable? - end.each do |name, reflection| - cardinality = reflection.macro.to_s.gsub("has_", "").to_sym - case cardinality - when :many - records = (archived_at ? set_record_window(send(name), name, reflection) : send(name)) - when :one, :belongs_to - self.class.unscoped { records = [] << send(name) } - end + def dependent_records_for_unarchival(name, reflection) + record = send(name) - [records].flatten.compact.each { |d| d.unarchive(force) } - send(name, :reload) + case reflection.macro.to_s.gsub('has_', '').to_sym + when :many + records = archived_at ? set_record_window(record, name, reflection) : record + when :one, :belongs_to + self.class.unscoped { records = [] << record } end + + [records].flatten.compact end - def set_archived_at(value, force=nil) + def unarchive_destroyed_dependent_records(force = nil) + self.class.reflections + .select { |_, reflection| 'destroy' == reflection.options[:dependent].to_s && reflection.klass.archivable? } + .each do |name, reflection| + dependent_records_for_unarchival(name, reflection).each { |record| record.unarchive(force) } + end + end + + def set_archived_at(value, force = nil) return self unless archivable? - record = get_archived_record + record = retrieve_archived_record record.archived_at = value begin should_ignore_validations?(force) ? record.save(validate: false) : record.save! - @attributes = record.instance_variable_get("@attributes") - rescue => e + @attributes = record.instance_variable_get('@attributes') + rescue => error record.destroy - raise(e) + raise(error) end end - def set_record_window(request, name, reflection) + def set_record_window(_, name, reflection) + quoted_table_name = reflection.quoted_table_name + window = ActiveArchive::Settings.config.dependent_record_window + send(name).unscope(where: :archived_at) .where([ - "#{reflection.quoted_table_name}.archived_at > ? AND #{reflection.quoted_table_name}.archived_at < ?", - archived_at - ActiveArchive.configuration.dependent_record_window, - archived_at + ActiveArchive.configuration.dependent_record_window - ]) + "#{quoted_table_name}.archived_at > ? AND #{quoted_table_name}.archived_at < ?", + archived_at - window, + archived_at + window + ]) end def should_force_destroy?(force) force.is_a?(Hash) ? force[:force] : (:force == force) end @@ -174,5 +175,7 @@ order.is_a?(Hash) && (true == order[:reverse]) end end end + +ActiveRecord::Base.include(ActiveArchive::Base)