Skip to content

Instantly share code, notes, and snippets.

@oscardelben
Created May 9, 2009 09:33
Show Gist options
  • Save oscardelben/109201 to your computer and use it in GitHub Desktop.
Save oscardelben/109201 to your computer and use it in GitHub Desktop.
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?
limit = options.delete(:limit)
{ :select => "#{Tag.table_name}.id, #{Tag.table_name}.name, COUNT(*) AS count",
:joins => joins.join(" "),
:conditions => conditions,
:group => group_by,
:limit => limit
}
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment