From 7ab364c7eb0469a323269b2927fe9070064575d7 Mon Sep 17 00:00:00 2001 From: JGW Maxwell Date: Wed, 11 Jul 2012 02:42:43 +0100 Subject: [PATCH 1/5] Mongoid functionality working for Mongoid 3.0, haven't got to grips with the tests yet, so will push those in next commit --- .../mongoid/impressionist_generator.rb | 8 +++ lib/generators/templates/impression.rb | 2 +- .../mongoid/impressionist_controller.rb | 9 ++++ lib/impressionist/engine.rb | 7 +++ .../models/mongoid/impression.rb | 32 ++++++++++++ .../mongoid/impressionist/impressionable.rb | 52 +++++++++++++++++++ 6 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 lib/generators/mongoid/impressionist_generator.rb create mode 100644 lib/impressionist/controllers/mongoid/impressionist_controller.rb create mode 100644 lib/impressionist/models/mongoid/impression.rb create mode 100644 lib/impressionist/models/mongoid/impressionist/impressionable.rb diff --git a/lib/generators/mongoid/impressionist_generator.rb b/lib/generators/mongoid/impressionist_generator.rb new file mode 100644 index 0000000..e56bf90 --- /dev/null +++ b/lib/generators/mongoid/impressionist_generator.rb @@ -0,0 +1,8 @@ +module Mongoid + module Generators + class ImpressionistGenerator < Rails::Generators::Base + # Empty for now, need it for generating the config file without + # triggering other ORM's generators. + end + end +end diff --git a/lib/generators/templates/impression.rb b/lib/generators/templates/impression.rb index fbdee91..5de89e4 100644 --- a/lib/generators/templates/impression.rb +++ b/lib/generators/templates/impression.rb @@ -1,5 +1,5 @@ # Use this hook to configure impressionist parameters Impressionist.setup do |config| - # Define ORM. Could be :active_record (default) and :mongo_mapper + # Define ORM. Could be :active_record (default), :mongo_mapper or :mongoid # config.orm = :active_record end diff --git a/lib/impressionist/controllers/mongoid/impressionist_controller.rb b/lib/impressionist/controllers/mongoid/impressionist_controller.rb new file mode 100644 index 0000000..73b5e92 --- /dev/null +++ b/lib/impressionist/controllers/mongoid/impressionist_controller.rb @@ -0,0 +1,9 @@ +ImpressionistController::InstanceMethods.send(:define_method, :direct_create_statement) do |query_params={}| + # creates a statment hash that contains default values for creating an impression. + # if :impressionable_id is a valid ObjectId then convert it into one + query_params.reverse_merge!( + :impressionable_type => controller_name.singularize.camelize, + :impressionable_id=> !Moped::BSON::ObjectId.legal?(params[:id]) ? params[:id] : Moped::BSON::ObjectId.from_string(params[:id]) + ) + associative_create_statement(query_params) +end \ No newline at end of file diff --git a/lib/impressionist/engine.rb b/lib/impressionist/engine.rb index cd754e9..dbf109f 100644 --- a/lib/impressionist/engine.rb +++ b/lib/impressionist/engine.rb @@ -13,10 +13,17 @@ module Impressionist require "impressionist/models/mongo_mapper/impression.rb" require "impressionist/models/mongo_mapper/impressionist/impressionable.rb" MongoMapper::Document.plugin Impressionist::Impressionable + elsif Impressionist.orm == :mongoid + require 'impressionist/models/mongoid/impression.rb' + require 'impressionist/models/mongoid/impressionist/impressionable.rb' + Mongoid::Document.send(:include, Impressionist::Impressionable) end end initializer 'impressionist.controller' do + if Impressionist.orm == :mongoid + require 'impressionist/controllers/mongoid/impressionist_controller.rb' + end ActiveSupport.on_load(:action_controller) do include ImpressionistController::InstanceMethods extend ImpressionistController::ClassMethods diff --git a/lib/impressionist/models/mongoid/impression.rb b/lib/impressionist/models/mongoid/impression.rb new file mode 100644 index 0000000..5c10785 --- /dev/null +++ b/lib/impressionist/models/mongoid/impression.rb @@ -0,0 +1,32 @@ +class Impression + include Mongoid::Document + include Mongoid::Timestamps + + attr_accessible :impressionable_type, :impressionable_field, :impressionable_id, :user_id, + :controller_name, :action_name, :view_name, :request_hash, :ip_address, + :session_hash, :message, :referrer + + belongs_to :impressionable, polymorphic: true + + field :user_id + field :controller_name + field :action_name + field :view_name + field :request_hash + field :ip_address + field :session_hash + field :message + field :referrer + + set_callback(:create, :after) do |doc| + unless impressionable_id.nil? + impressionable_class = doc.impressionable_type.constantize + + if impressionable_class.impressionist_counter_cache_options + resource = impressionable_class.find(doc.impressionable_id) + resource.try(:update_impressionist_counter_cache) + end + end + end + +end diff --git a/lib/impressionist/models/mongoid/impressionist/impressionable.rb b/lib/impressionist/models/mongoid/impressionist/impressionable.rb new file mode 100644 index 0000000..5f04b03 --- /dev/null +++ b/lib/impressionist/models/mongoid/impressionist/impressionable.rb @@ -0,0 +1,52 @@ +module Impressionist + module Impressionable + extend ActiveSupport::Concern + + module ClassMethods + def is_impressionable(options={}) + has_many :impressions, as: :impressionable, dependent: :destroy + @impressionist_cache_options = options[:counter_cache] + if !@impressionist_cache_options.nil? + opts = impressionist_counter_cache_options + field opts[:column_name], type: Integer + end + end + + def impressionist_counter_cache_options + if @impressionist_cache_options + options = { :column_name => :impressions_count, :unique => false } + options.merge!(@impressionist_cache_options) if @impressionist_cache_options.is_a?(Hash) + options + end + end + + def impressionist_counter_caching? + impressionist_counter_cache_options.present? + end + + def counter_caching? + ::ActiveSupport::Deprecation.warn("#counter_caching? is deprecated; please use #impressionist_counter_caching? instead") + impressionist_counter_caching? + end + end + + def impressionable? + true + end + + def impressionist_count(options={}) + options.reverse_merge!(:filter=>:request_hash, :start_date=>nil, :end_date=>Time.now) + imps = options[:start_date].blank? ? impressions : impressions.between(created_at: options[:start_date]..options[:end_date]) + options[:filter] == :all ? imps.count : imps.where(options[:filter].ne => nil).count + end + + def update_impressionist_counter_cache + cache_options = self.class.impressionist_counter_cache_options + column_name = cache_options[:column_name].to_sym + count = cache_options[:unique] ? impressionist_count(:filter => :ip_address) : impressionist_count + old_count = send(column_name) || 0 + self.inc(column_name, (count - old_count)) + end + + end +end \ No newline at end of file From a53363d9f63daaed2adc6e9ea9c12989feefe709 Mon Sep 17 00:00:00 2001 From: JGW Maxwell Date: Wed, 11 Jul 2012 02:58:59 +0100 Subject: [PATCH 2/5] Fixed default ActiveRecord setting preventing generator from running. --- lib/impressionist/engine.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/impressionist/engine.rb b/lib/impressionist/engine.rb index dbf109f..fddb04f 100644 --- a/lib/impressionist/engine.rb +++ b/lib/impressionist/engine.rb @@ -5,7 +5,7 @@ module Impressionist class Engine < Rails::Engine initializer 'impressionist.model' do |app| require "#{root}/app/models/impressionist/impressionable.rb" - if Impressionist.orm == :active_record + if Impressionist.orm == :active_record && defined? ActiveRecord require "impressionist/models/active_record/impression.rb" require "impressionist/models/active_record/impressionist/impressionable.rb" ActiveRecord::Base.send(:include, Impressionist::Impressionable) From 2f8c47a46f4276fa155b85e911d7a1a543de28a3 Mon Sep 17 00:00:00 2001 From: JGW Maxwell Date: Wed, 11 Jul 2012 03:45:24 +0100 Subject: [PATCH 3/5] fixed for Mongoid 2 support --- lib/generators/impressionist_generator.rb | 1 + lib/generators/templates/impression-mongoid-2.rb | 1 + .../controllers/mongoid/impressionist_controller.rb | 3 ++- .../mongoid/mongoid2-impressionist_controller.rb | 10 ++++++++++ 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 lib/generators/templates/impression-mongoid-2.rb create mode 100644 lib/impressionist/controllers/mongoid/mongoid2-impressionist_controller.rb diff --git a/lib/generators/impressionist_generator.rb b/lib/generators/impressionist_generator.rb index 30290af..008f1ec 100644 --- a/lib/generators/impressionist_generator.rb +++ b/lib/generators/impressionist_generator.rb @@ -7,6 +7,7 @@ module Impressionist def copy_config_file template 'impression.rb', 'config/initializers/impression.rb' end + end end end diff --git a/lib/generators/templates/impression-mongoid-2.rb b/lib/generators/templates/impression-mongoid-2.rb new file mode 100644 index 0000000..0d1a95e --- /dev/null +++ b/lib/generators/templates/impression-mongoid-2.rb @@ -0,0 +1 @@ +impression-mongoid-2.rb \ No newline at end of file diff --git a/lib/impressionist/controllers/mongoid/impressionist_controller.rb b/lib/impressionist/controllers/mongoid/impressionist_controller.rb index 73b5e92..426c5b8 100644 --- a/lib/impressionist/controllers/mongoid/impressionist_controller.rb +++ b/lib/impressionist/controllers/mongoid/impressionist_controller.rb @@ -1,9 +1,10 @@ ImpressionistController::InstanceMethods.send(:define_method, :direct_create_statement) do |query_params={}| # creates a statment hash that contains default values for creating an impression. # if :impressionable_id is a valid ObjectId then convert it into one + base = (defined? Moped) ? Moped::BSON : BSON query_params.reverse_merge!( :impressionable_type => controller_name.singularize.camelize, - :impressionable_id=> !Moped::BSON::ObjectId.legal?(params[:id]) ? params[:id] : Moped::BSON::ObjectId.from_string(params[:id]) + :impressionable_id=> !base::ObjectId.legal?(params[:id]) ? params[:id] : base::ObjectId.from_string(params[:id]) ) associative_create_statement(query_params) end \ No newline at end of file diff --git a/lib/impressionist/controllers/mongoid/mongoid2-impressionist_controller.rb b/lib/impressionist/controllers/mongoid/mongoid2-impressionist_controller.rb new file mode 100644 index 0000000..de005a7 --- /dev/null +++ b/lib/impressionist/controllers/mongoid/mongoid2-impressionist_controller.rb @@ -0,0 +1,10 @@ +ImpressionistController::InstanceMethods.send(:define_method, :direct_create_statement) do |query_params={}| + # creates a statment hash that contains default values for creating an impression. + # if :impressionable_id is a valid ObjectId then convert it into one + base = (defined? Moped) ? Moped::BSON :: BSON + query_params.reverse_merge!( + :impressionable_type => controller_name.singularize.camelize, + :impressionable_id=> !base::ObjectId.legal?(params[:id]) ? params[:id] : base::ObjectId.from_string(params[:id]) + ) + associative_create_statement(query_params) +end \ No newline at end of file From 7eae7fb1d0573a072d716cbb127f61230b4f9b4e Mon Sep 17 00:00:00 2001 From: JGW Maxwell Date: Wed, 11 Jul 2012 03:45:55 +0100 Subject: [PATCH 4/5] removed unneeded file --- lib/generators/templates/impression-mongoid-2.rb | 1 - 1 file changed, 1 deletion(-) delete mode 100644 lib/generators/templates/impression-mongoid-2.rb diff --git a/lib/generators/templates/impression-mongoid-2.rb b/lib/generators/templates/impression-mongoid-2.rb deleted file mode 100644 index 0d1a95e..0000000 --- a/lib/generators/templates/impression-mongoid-2.rb +++ /dev/null @@ -1 +0,0 @@ -impression-mongoid-2.rb \ No newline at end of file From 8f2c219b97d0c85f6698512f761c6b4d80be1f22 Mon Sep 17 00:00:00 2001 From: JGW Maxwell Date: Wed, 11 Jul 2012 10:33:35 +0100 Subject: [PATCH 5/5] removed more files --- .../mongoid/mongoid2-impressionist_controller.rb | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 lib/impressionist/controllers/mongoid/mongoid2-impressionist_controller.rb diff --git a/lib/impressionist/controllers/mongoid/mongoid2-impressionist_controller.rb b/lib/impressionist/controllers/mongoid/mongoid2-impressionist_controller.rb deleted file mode 100644 index de005a7..0000000 --- a/lib/impressionist/controllers/mongoid/mongoid2-impressionist_controller.rb +++ /dev/null @@ -1,10 +0,0 @@ -ImpressionistController::InstanceMethods.send(:define_method, :direct_create_statement) do |query_params={}| - # creates a statment hash that contains default values for creating an impression. - # if :impressionable_id is a valid ObjectId then convert it into one - base = (defined? Moped) ? Moped::BSON :: BSON - query_params.reverse_merge!( - :impressionable_type => controller_name.singularize.camelize, - :impressionable_id=> !base::ObjectId.legal?(params[:id]) ? params[:id] : base::ObjectId.from_string(params[:id]) - ) - associative_create_statement(query_params) -end \ No newline at end of file