Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module ActiveRecord
- module Acts
- module TaggableOn
- module SingletonMethods
- def find_options_for_tag_counts(options = {})
- options.assert_valid_keys :start_at, :end_at, :conditions, :at_least, :at_most, :order, :limit, :on, :id
- scope = scope(:find)
- start_at = sanitize_sql(["#{Tagging.table_name}.created_at >= ?", options.delete(:start_at)]) if options[:start_at]
- end_at = sanitize_sql(["#{Tagging.table_name}.created_at <= ?", options.delete(:end_at)]) if options[:end_at]
- taggable_type = sanitize_sql(["#{Tagging.table_name}.taggable_type = ?", base_class.name])
- taggable_id = sanitize_sql(["#{Tagging.table_name}.taggable_id = ?", options.delete(:id)]) if options[:id]
- conditions = [
- taggable_type,
- taggable_id,
- options[:conditions],
- start_at,
- end_at
- ]
- conditions = conditions.compact.join(' AND ')
- conditions = merge_conditions(conditions, scope[:conditions]) if scope
- joins = ["LEFT OUTER JOIN #{Tagging.table_name} ON #{Tag.table_name}.id = #{Tagging.table_name}.tag_id"]
- joins << sanitize_sql(["AND #{Tagging.table_name}.context = ?",options.delete(:on).to_s]) unless options[:on].nil?
- joins << "LEFT OUTER JOIN #{table_name} ON #{table_name}.#{primary_key} = #{Tagging.table_name}.taggable_id"
- joins << scope[:joins] if scope && scope[:joins]
- at_least = sanitize_sql(['COUNT(*) >= ?', options.delete(:at_least)]) if options[:at_least]
- at_most = sanitize_sql(['COUNT(*) <= ?', options.delete(:at_most)]) if options[:at_most]
- having = [at_least, at_most].compact.join(' AND ')
- group_by = "#{Tag.table_name}.id, #{Tag.table_name}.name HAVING COUNT(*) > 0"
- group_by << " AND #{having}" unless having.blank?
- { :select => "#{Tag.table_name}.id, #{Tag.table_name}.name, COUNT(*) AS count",
- :joins => joins.join(" "),
- :conditions => conditions,
- :group => group_by,
- :limit => options.delete(:limit)
- }
- end
- end
- end
- end
- end
Add Comment
Please, Sign In to add comment