diff --git a/.gitignore b/.gitignore index 685130c..81acdb5 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ /test_app/test /test_app/vendor Gemfile.lock +*.swo +*.swp diff --git a/lib/impressionist/counter_cache.rb b/lib/impressionist/counter_cache.rb index 73ef9af..7f51aaf 100644 --- a/lib/impressionist/counter_cache.rb +++ b/lib/impressionist/counter_cache.rb @@ -1,10 +1,3 @@ -# Note -# It is only updatable if -# impressionist_id && impressionist_type(class) are present && -# impressionable_class(which is imp_type.constantize) is counter_caching -# Defined like so -# is_impressionable :counter_cache => true - module Impressionist module CounterCache @@ -12,21 +5,39 @@ module Impressionist private - # if updatable returns true, it must be qualified to update_counters - # impressionable_class instance var is set when updatable? is called + # A valid impression must + # have a valid impressionable class + # be counter_caching + # have a record saved in the db + # then it should give it a try def impressionable_counter_cache_updatable? - updatable? && impressionable_try + updatable? && impressionable_try end - # asks imp_id && imp_class whether it's present or not - # so that it is updatable def updatable? - @impressionable_class = impressionable_class_set - impressionable_valid? + valid_impressionable_class? && impressionable_find end - def impressionable_valid? - (self.impressionable_id.present? && impressionable_class) + def valid_impressionable_class? + set_impressionable_class && counter_caching? + end + + def set_impressionable_class + klass = self.impressionable_type || false + @impressionable_class = klass. + to_s.safe_constantize || false + end + + # default mode is ERROR + def impressionist_log(str, mode=:error) + Rails.logger.send(mode.to_s, str) + end + + # receives an entity(instance of a Model) and then tries to update + # counter_cache column + # entity is a impressionable instance model + def impressionable_try + entity.try(:update_impressionist_counter_cache) end def impressionable_find @@ -37,29 +48,11 @@ module Impressionist end - # imps_type == nil, constantize returns Object - # It attemps to return false so it won't be updatable - # calls to_s otherwise it would try to constantize nil - # and it would raise an exeception - # Must be !~ Object and be counter_caching to be qualified as updatable - def impressionable_class_set - klass = self.impressionable_type.to_s.constantize - (klass.to_s !~ /Object/) && klass.impressionist_counter_caching? ? klass : false + def counter_caching? + impressionable_class. + impressionist_counter_caching? end - # default mode is ERROR - # ruby 1.8.7 support - def impressionist_log(str, mode=:error) - Rails.logger.send(mode.to_s, str) - end - - # receives an entity(instance of a Model) and then tries to update - # counter_cache column - # entity is a impressionable instance model - def impressionable_try - impressionable_find - entity.try(:update_impressionist_counter_cache) - end # Returns false, as it is only handling one exeception # It would make updatable to fail thereafter it would not try diff --git a/tests/test_app/db/schema.rb b/tests/test_app/db/schema.rb index b12fa39..9508e50 100644 --- a/tests/test_app/db/schema.rb +++ b/tests/test_app/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20130709003307) do +ActiveRecord::Schema.define(:version => 20130719024021) do create_table "articles", :force => true do |t| t.string "name"