Module: CustomCounterCache::Model::ActsAsMethods
- Defined in:
- lib/custom_counter_cache/model.rb
Instance Method Summary collapse
- #define_counter_cache(cache_column, &block) ⇒ Object
- #update_counter_cache(association, cache_column, options = {}) ⇒ Object
Instance Method Details
#define_counter_cache(cache_column, &block) ⇒ Object
9 10 11 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 |
# File 'lib/custom_counter_cache/model.rb', line 9 def define_counter_cache(cache_column, &block) return unless table_exists? # counter accessors unless column_names.include?(cache_column.to_s) has_many :counters, :as => :countable, :dependent => :destroy define_method "#{cache_column}" do # check if the counter is loaded if counters.loaded? && counter = counters.detect{|c| c.key == cache_column.to_s } counter.value else counters.find_by_key(cache_column.to_s).try(:value).to_i end end define_method "#{cache_column}=" do |count| if ( counter = counters.find_by_key(cache_column.to_s) ) counter.update_attribute :value, count.to_i else counters.create :key => cache_column.to_s, :value => count.to_i end end end # counter update method define_method "update_#{cache_column}" do if self.class.column_names.include?(cache_column.to_s) update_attribute cache_column, block.call(self) else send "#{cache_column}=", block.call(self) end end end |
#update_counter_cache(association, cache_column, options = {}) ⇒ Object
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 68 69 70 71 72 73 74 75 |
# File 'lib/custom_counter_cache/model.rb', line 42 def update_counter_cache(association, cache_column, = {}) return unless table_exists? association = association.to_sym cache_column = cache_column.to_sym method_name = "callback_#{cache_column}".to_sym reflection = reflect_on_association(association) foreign_key = reflection.[:foreign_key] || reflection.association_foreign_key # define callback define_method method_name do # update old association if send("#{foreign_key}_changed?") || ( reflection.[:polymorphic] && send("#{association}_type_changed?") ) old_id = send("#{foreign_key}_was") klass = if reflection.[:polymorphic] ( send("#{association}_type_was") || send("#{association}_type") ).constantize else reflection.klass end if ( old_id && record = klass.find(old_id) ) record.send("update_#{cache_column}") end end # update new association if ( record = send(association) ) record.send("update_#{cache_column}") end end # set callbacks after_create method_name, after_update method_name, after_destroy method_name, end |