Permalink
Browse files

Merge pull request #46 from jgwmaxwell/mongoid

Mongoid Support
  • Loading branch information...
2 parents bdd7a05 + 8f2c219 commit 7a93fff25568cd3edcc63c1a3c4b60dc6b81d2b7 @johnmcaliley johnmcaliley committed Jul 19, 2012
@@ -7,6 +7,7 @@ class ImpressionistGenerator < Rails::Generators::Base
def copy_config_file
template 'impression.rb', 'config/initializers/impression.rb'
end
+
end
end
end
@@ -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
@@ -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
@@ -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
@@ -5,18 +5,25 @@ 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)
elsif Impressionist.orm == :mongo_mapper
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
@@ -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
@@ -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

0 comments on commit 7a93fff

Please sign in to comment.