module YeshouaCrm::ActsAsTaggable::Taggable::SingletonMethods
Public Instance Methods
caching_tag_list?()
click to toggle source
# File lib/yeshoua_crm/acts_as_taggable/rcrm_acts_as_taggable.rb, line 252 def caching_tag_list? column_names.include?(cached_tag_list_column_name) end
find_options_for_find_tagged_with(tags, options = {})
click to toggle source
# File lib/yeshoua_crm/acts_as_taggable/rcrm_acts_as_taggable.rb, line 159 def find_options_for_find_tagged_with(tags, options = {}) tags = tags.is_a?(Array) ? TagList.new(tags.map(&:to_s)) : TagList.from(tags) options = options.dup return {} if tags.empty? conditions = [] conditions << sanitize_sql(options.delete(:conditions)) if options[:conditions] taggings_alias, tags_alias = "#{table_name}_taggings", "#{table_name}_tags" joins = [ "INNER JOIN #{Tagging.table_name} #{taggings_alias} ON #{taggings_alias}.taggable_id = #{table_name}.#{primary_key} AND #{taggings_alias}.taggable_type = #{quote_string_value(base_class.name)}", "INNER JOIN #{Tag.table_name} #{tags_alias} ON #{tags_alias}.id = #{taggings_alias}.tag_id" ] if options.delete(:exclude) conditions << <<-END #{table_name}.id NOT IN (SELECT #{Tagging.table_name}.taggable_id FROM #{Tagging.table_name} INNER JOIN #{Tag.table_name} ON #{Tagging.table_name}.tag_id = #{Tag.table_name}.id WHERE #{tags_condition(tags)} AND #{Tagging.table_name}.taggable_type = #{quote_string_value(base_class.name)}) END else if options.delete(:match_all) joins << joins_for_match_all_tags(tags) else conditions << tags_condition(tags, tags_alias) end end { :select => "DISTINCT #{table_name}.* ", :joins => joins.join(" "), :conditions => conditions.join(" AND ") }.reverse_merge!(options) end
find_options_for_tag_counts(options = {})
click to toggle source
# File lib/yeshoua_crm/acts_as_taggable/rcrm_acts_as_taggable.rb, line 228 def find_options_for_tag_counts(options = {}) options = options.dup scope = scope_attributes # scope(:find) conditions = [] conditions << send(:sanitize_sql_for_assignment, options.delete(:conditions)) if options[:conditions] conditions << send(:sanitize_sql_for_assignment, scope) if scope conditions << "#{Tagging.table_name}.taggable_type = #{quote_string_value(base_class.name)}" conditions << type_condition unless descends_from_active_record? conditions.delete('') conditions.compact! conditions = conditions.join(" AND ") joins = ["INNER JOIN #{table_name} ON #{table_name}.#{primary_key} = #{Tagging.table_name}.taggable_id"] joins << options.delete(:joins) if options[:joins].present? # joins << scope[:joins] if scope && scope[:joins].present? joins = joins.join(" ") options = { :conditions => conditions, :joins => joins }.update(options) Tag.options_for_counts(options) end
find_tagged_with(*args)
click to toggle source
Pass either a tag, string, or an array of strings or tags.
Options:
:exclude - Find models that are not tagged with the given tags :match_all - Find models that match all of the given tags, not just one :conditions - A piece of SQL conditions to add to the query
# File lib/yeshoua_crm/acts_as_taggable/rcrm_acts_as_taggable.rb, line 152 def find_tagged_with(*args) options = find_options_for_find_tagged_with(*args) options.blank? ? [] : select(options[:select]).where(options[:conditions]).joins(options[:joins]).order(options[:order]).to_a end
Also aliased as: tagged_with
tag_counts(options = {})
click to toggle source
Calculate the tag counts for all tags.
See Tag.counts for available options.
# File lib/yeshoua_crm/acts_as_taggable/rcrm_acts_as_taggable.rb, line 221 def tag_counts(options = {}) # Tag.find(:all, find_options_for_tag_counts(options)) opt = find_options_for_tag_counts(options) Tag.select(opt[:select]).where(opt[:conditions]).joins(opt[:joins]).group(opt[:group]).having(opt[:having]).order(opt[:order]).limit(options[:limit]) end
Also aliased as: all_tag_counts
Private Instance Methods
merge_conditions(*conditions)
click to toggle source
# File lib/yeshoua_crm/acts_as_taggable/rcrm_acts_as_taggable.rb, line 267 def merge_conditions(*conditions) segments = [] conditions.each do |condition| unless condition.blank? sql = sanitize_sql(condition) segments << sql unless sql.blank? end end "(#{segments.join(') AND (')})" unless segments.empty? end
quote_string_value(object)
click to toggle source
# File lib/yeshoua_crm/acts_as_taggable/rcrm_acts_as_taggable.rb, line 258 def quote_string_value(object) connection.quote(object) end