Guest User

Untitled

a guest
Jun 19th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.21 KB | None | 0 0
  1. module ActiveRecord
  2. module Acts
  3. module TaggableOn
  4. module SingletonMethods
  5. def find_options_for_tag_counts(options = {})
  6. options.assert_valid_keys :start_at, :end_at, :conditions, :at_least, :at_most, :order, :limit, :on, :id
  7.  
  8. scope = scope(:find)
  9. start_at = sanitize_sql(["#{Tagging.table_name}.created_at >= ?", options.delete(:start_at)]) if options[:start_at]
  10. end_at = sanitize_sql(["#{Tagging.table_name}.created_at <= ?", options.delete(:end_at)]) if options[:end_at]
  11.  
  12. taggable_type = sanitize_sql(["#{Tagging.table_name}.taggable_type = ?", base_class.name])
  13. taggable_id = sanitize_sql(["#{Tagging.table_name}.taggable_id = ?", options.delete(:id)]) if options[:id]
  14.  
  15. conditions = [
  16. taggable_type,
  17. taggable_id,
  18. options[:conditions],
  19. start_at,
  20. end_at
  21. ]
  22.  
  23. conditions = conditions.compact.join(' AND ')
  24. conditions = merge_conditions(conditions, scope[:conditions]) if scope
  25.  
  26. joins = ["LEFT OUTER JOIN #{Tagging.table_name} ON #{Tag.table_name}.id = #{Tagging.table_name}.tag_id"]
  27. joins << sanitize_sql(["AND #{Tagging.table_name}.context = ?",options.delete(:on).to_s]) unless options[:on].nil?
  28. joins << "LEFT OUTER JOIN #{table_name} ON #{table_name}.#{primary_key} = #{Tagging.table_name}.taggable_id"
  29. joins << scope[:joins] if scope && scope[:joins]
  30.  
  31. at_least = sanitize_sql(['COUNT(*) >= ?', options.delete(:at_least)]) if options[:at_least]
  32. at_most = sanitize_sql(['COUNT(*) <= ?', options.delete(:at_most)]) if options[:at_most]
  33. having = [at_least, at_most].compact.join(' AND ')
  34. group_by = "#{Tag.table_name}.id, #{Tag.table_name}.name HAVING COUNT(*) > 0"
  35. group_by << " AND #{having}" unless having.blank?
  36.  
  37. { :select => "#{Tag.table_name}.id, #{Tag.table_name}.name, COUNT(*) AS count",
  38. :joins => joins.join(" "),
  39. :conditions => conditions,
  40. :group => group_by,
  41. :limit => options.delete(:limit)
  42. }
  43. end
  44. end
  45. end
  46. end
  47. end
Add Comment
Please, Sign In to add comment