Module: SoftDeletion::Core::ClassMethods

Defined in:
lib/soft_deletion/core.rb

Instance Method Summary collapse

Instance Method Details

#mark_as_soft_deleted_sqlObject



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

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

#soft_delete_all!(ids_or_models) ⇒ Object



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

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



19
20
21
22
23
# File 'lib/soft_deletion/core.rb', line 19

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

#with_deletedObject



25
26
27
28
29
30
# File 'lib/soft_deletion/core.rb', line 25

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