Module: ThinkingSphinx::ActiveRecord::Delta

Defined in:
lib/thinking_sphinx/active_record/delta.rb

Overview

This module contains all the delta-related code for models. There isn’t really anything you need to call manually in here - except perhaps index_delta, but not sure what reason why.

Class Method Summary collapse

Class Method Details

.included(base) ⇒ Object

Code for after_commit callback is written by Eli Miller: elimiller.blogspot.com/2007/06/proper-cache-expiry-with-aftercommit.html with slight modification from Joost Hietbrink.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/thinking_sphinx/active_record/delta.rb', line 12

def self.included(base)
  base.class_eval do
    class << self
      # Build the delta index for the related model. This won't be called
      # if running in the test environment.
      #
      def index_delta(instance = nil)
        delta_object.index(self, instance)
      end
      
      def delta_object
        self.sphinx_indexes.first.delta_object
      end
    end
    
    def toggled_delta?
      self.class.delta_object.toggled(self)
    end
    
    private
    
    # Set the delta value for the model to be true.
    def toggle_delta
      self.class.delta_object.toggle(self) if should_toggle_delta?
    end
    
    # Build the delta index for the related model. This won't be called
    # if running in the test environment.
    # 
    def index_delta
      self.class.index_delta(self) if self.class.delta_object.toggled(self)
    end
    
    def should_toggle_delta?
      self.new_record? || indexed_data_changed?
    end
    
    def indexed_data_changed?
      sphinx_indexes.any? { |index|
        index.fields.any? { |field| field.changed?(self) } ||
        index.attributes.any? { |attrib|
          attrib.public? && attrib.changed?(self) && !attrib.updatable?
        }
      }
    end
  end
end