Module: ActsAsSourceable::HelperMethods

Defined in:
lib/acts_as_sourceable/acts_as_sourceable.rb

Class Method Summary collapse

Class Method Details

.garbage_collectObject

Removes registry entries that no longer belong to a sourceable, item, collection, or holding institution



154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/acts_as_sourceable/acts_as_sourceable.rb', line 154

def self.garbage_collect
  # Remove all registry entries where the sourceable is gone
  ActsAsSourceable::RegistryEntry.uniq.pluck(:sourceable_type).each do |sourceable_type|
    sourceable_table_name = sourceable_type.constantize.table_name
    sourceable_id_sql = ActsAsSourceable::RegistryEntry
      .select("#{ActsAsSourceable::RegistryEntry.table_name}.id")
      .where(:sourceable_type => sourceable_type)
      .joins("LEFT OUTER JOIN #{sourceable_table_name} ON #{sourceable_table_name}.id = #{ActsAsSourceable::RegistryEntry.table_name}.sourceable_id")
      .where("#{sourceable_table_name}.id IS NULL").to_sql

    ActsAsSourceable::RegistryEntry.delete_all("id IN (#{sourceable_id_sql})")
  end

  # Remove all registry entries where the source is gone
  ActsAsSourceable::RegistryEntry.uniq.pluck(:source_type).each do |source_type|
    source_class = source_type.constantize
    source_table_name = source_class.table_name
    source_id_sql = ActsAsSourceable::RegistryEntry
      .select("#{ActsAsSourceable::RegistryEntry.table_name}.id")
      .where(:source_type => source_type)
      .joins("LEFT OUTER JOIN #{source_table_name} ON #{source_table_name}.id = #{ActsAsSourceable::RegistryEntry.table_name}.source_id")
      .where("#{source_table_name}.id IS NULL").to_sql

    sourceables = ActsAsSourceable::RegistryEntry.where("id IN (#{source_id_sql})").collect(&:sourceable)
    ActsAsSourceable::RegistryEntry.where("id IN (#{source_id_sql})").delete_all
    sourceables.each{|sourceable| sourceable.send(:update_sourceable_cache_column) }
  end
end