class ThinkingSphinx::Context

Attributes

indexed_models[R]

Public Class Methods

new(*models) click to toggle source
# File lib/thinking_sphinx/context.rb, line 4
def initialize(*models)
  @indexed_models = []
end

Public Instance Methods

add_indexed_model(model) click to toggle source
# File lib/thinking_sphinx/context.rb, line 25
def add_indexed_model(model)
  model = model.name if model.is_a?(Class)

  indexed_models << model
  indexed_models.uniq!
  indexed_models.sort!
end
define_indexes() click to toggle source
# File lib/thinking_sphinx/context.rb, line 19
def define_indexes
  indexed_models.each { |model|
    model.constantize.define_indexes
  }
end
prepare() click to toggle source
# File lib/thinking_sphinx/context.rb, line 8
def prepare
  ThinkingSphinx::Configuration.instance.indexed_models.each do |model|
    add_indexed_model model
  end

  return unless indexed_models.empty?

  load_models
  add_indexed_models
end
superclass_indexed_models() click to toggle source
# File lib/thinking_sphinx/context.rb, line 33
def superclass_indexed_models
  klasses = indexed_models.collect { |name| name.constantize }
  klasses.reject { |klass|
    klass.superclass.ancestors.any? { |ancestor| klasses.include?(ancestor) }
  }.collect { |klass| klass.name }
end

Private Instance Methods

add_indexed_models() click to toggle source
# File lib/thinking_sphinx/context.rb, line 42
def add_indexed_models
  ActiveRecord::Base.descendants.each do |klass|
    add_indexed_model klass if klass.has_sphinx_indexes?
  end
end
load_models() click to toggle source

Make sure all models are loaded - without reloading any that ActiveRecord::Base is already aware of (otherwise we start to hit some messy dependencies issues).

# File lib/thinking_sphinx/context.rb, line 52
def load_models
  ThinkingSphinx::Configuration.instance.model_directories.each do |base|
    Dir["#{base}**/*.rb"].each do |file|
      model_name = file.gsub(/^#{base}([\w_\/\]+)\.rb/, '\1')

      next if model_name.nil?
      camelized_model = model_name.camelize
      next if ::ActiveRecord::Base.descendants.detect { |model|
        model.name == camelized_model
      }

      begin
        camelized_model.constantize
      rescue LoadError
        # Make sure that STI subclasses in subfolders are loaded.
        model_name.gsub!(/.*[\/\]/, '').nil? ? next : retry
      rescue Exception => err
        STDERR.puts "Warning: Error loading #{file}:"
        STDERR.puts err.message
        STDERR.puts err.backtrace.join("\n"), ''
      end
    end
  end
end