Module: SoftDeletion::Core::ClassMethods

Defined in:
lib/soft_deletion/core.rb

Instance Method Summary collapse

Instance Method Details

#mark_as_soft_deleted_sqlObject



36
37
38
# File 'lib/soft_deletion/core.rb', line 36

def mark_as_soft_deleted_sql
  ["deleted_at = ?", Time.now]
end

#soft_delete_all!(ids_or_models) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/soft_deletion/core.rb', line 40

def soft_delete_all!(ids_or_models)
  ids_or_models = Array.wrap(ids_or_models)

  if ids_or_models.first.is_a?(ActiveRecord::Base)
    ids = ids_or_models.map(&:id)
    models = ids_or_models
  else
    ids = ids_or_models
    models = if ActiveRecord::VERSION::MAJOR >= 4
      where(:id => ids)
    else
      all(:conditions => { :id => ids })
    end
  end

  transaction do
    if ActiveRecord::VERSION::MAJOR >= 4
      where(:id => ids).update_all(mark_as_soft_deleted_sql)
    else
      update_all(mark_as_soft_deleted_sql, :id => ids)
    end

    models.each do |model|
      model.soft_delete_dependencies.each(&:soft_delete!)
      model.run_callbacks ActiveRecord::VERSION::MAJOR > 2 ? :soft_delete : :after_soft_delete
    end
  end
end

#soft_delete_dependentsObject



23
24
25
26
27
# File 'lib/soft_deletion/core.rb', line 23

def soft_delete_dependents
  reflect_on_all_associations.
    select { |a| [:destroy, :delete_all, :nullify].include?(a.options[:dependent]) }.
    select { |a| a.klass.method_defined?(:soft_delete!) }.map(&:name)
end

#with_deletedObject



29
30
31
32
33
34
# File 'lib/soft_deletion/core.rb', line 29

def with_deleted
  method = (ActiveRecord::VERSION::MAJOR >= 4 ? :unscoped : :with_exclusive_scope)
  send(method) do
    yield self
  end
end