Module: ActsAsTaggableOn::Taggable::Collection::ClassMethods
- Defined in:
- lib/acts_as_taggable_on/taggable/collection.rb
Instance Method Summary collapse
- #acts_as_taggable_on(*args) ⇒ Object
-
#all_tag_counts(options = {}) ⇒ Object
Calculate the tag counts for all tags.
-
#all_tags(options = {}) ⇒ Object
Calculate the tag names.
- #initialize_acts_as_taggable_on_collection ⇒ Object
- #safe_to_sql(relation) ⇒ Object
- #tag_counts_on(context, options = {}) ⇒ Object
- #tags_on(context, options = {}) ⇒ Object
Instance Method Details
#acts_as_taggable_on(*args) ⇒ Object
34 35 36 37 |
# File 'lib/acts_as_taggable_on/taggable/collection.rb', line 34 def acts_as_taggable_on(*args) super(*args) initialize_acts_as_taggable_on_collection end |
#all_tag_counts(options = {}) ⇒ Object
Calculate the tag counts for all tags.
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/acts_as_taggable_on/taggable/collection.rb', line 93 def all_tag_counts( = {}) = .dup .assert_valid_keys :start_at, :end_at, :conditions, :at_least, :at_most, :order, :limit, :on, :id ## Generate conditions: [:conditions] = sanitize_sql([:conditions]) if [:conditions] ## Generate scope: tagging_scope = ActsAsTaggableOn::Tagging.select("#{ActsAsTaggableOn::Tagging.table_name}.tag_id, COUNT(#{ActsAsTaggableOn::Tagging.table_name}.tag_id) AS tags_count") tag_scope = ActsAsTaggableOn::Tag.select("#{ActsAsTaggableOn::Tag.table_name}.*, #{ActsAsTaggableOn::Tagging.table_name}.tags_count AS count").order([:order]).limit([:limit]) # Current model is STI descendant, so add type checking to the join condition unless descends_from_active_record? taggable_join = "INNER JOIN #{table_name} ON #{table_name}.#{primary_key} = #{ActsAsTaggableOn::Tagging.table_name}.taggable_id" taggable_join = taggable_join + " AND #{table_name}.#{inheritance_column} = '#{name}'" tagging_scope = tagging_scope.joins(taggable_join) end # Conditions tagging_conditions().each { |condition| tagging_scope = tagging_scope.where(condition) } tag_scope = tag_scope.where([:conditions]) # GROUP BY and HAVING clauses: having = ["COUNT(#{ActsAsTaggableOn::Tagging.table_name}.tag_id) > 0"] if [:at_least] having.push sanitize_sql(["COUNT(#{ActsAsTaggableOn::Tagging.table_name}.tag_id) >= ?", .delete(:at_least)]) end if [:at_most] having.push sanitize_sql(["COUNT(#{ActsAsTaggableOn::Tagging.table_name}.tag_id) <= ?", .delete(:at_most)]) end having = having.compact.join(' AND ') group_columns = "#{ActsAsTaggableOn::Tagging.table_name}.tag_id" unless [:id] # Append the current scope to the scope, because we can't use scope(:find) in RoR 3.0 anymore: tagging_scope = generate_tagging_scope_in_clause(tagging_scope, table_name, primary_key) end tagging_scope = tagging_scope.group(group_columns).having(having) tag_scope_joins(tag_scope, tagging_scope) end |
#all_tags(options = {}) ⇒ Object
Calculate the tag names. To be used when you don’t need tag counts and want to avoid the taggable joins.
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/acts_as_taggable_on/taggable/collection.rb', line 58 def ( = {}) = .dup .assert_valid_keys :start_at, :end_at, :conditions, :order, :limit, :on ## Generate conditions: [:conditions] = sanitize_sql([:conditions]) if [:conditions] ## Generate scope: tagging_scope = ActsAsTaggableOn::Tagging.select("#{ActsAsTaggableOn::Tagging.table_name}.tag_id") tag_scope = ActsAsTaggableOn::Tag.select("#{ActsAsTaggableOn::Tag.table_name}.*").order([:order]).limit([:limit]) # Joins and conditions tagging_conditions().each { |condition| tagging_scope = tagging_scope.where(condition) } tag_scope = tag_scope.where([:conditions]) group_columns = "#{ActsAsTaggableOn::Tagging.table_name}.tag_id" # Append the current scope to the scope, because we can't use scope(:find) in RoR 3.0 anymore: tagging_scope = generate_tagging_scope_in_clause(tagging_scope, table_name, primary_key).group(group_columns) tag_scope_joins(tag_scope, tagging_scope) end |
#initialize_acts_as_taggable_on_collection ⇒ Object
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/acts_as_taggable_on/taggable/collection.rb', line 12 def initialize_acts_as_taggable_on_collection tag_types.map(&:to_s).each do |tag_type| class_eval <<-RUBY, __FILE__, __LINE__ + 1 def self.#{tag_type.singularize}_counts(options={}) tag_counts_on('#{tag_type}', options) end def #{tag_type.singularize}_counts(options = {}) tag_counts_on('#{tag_type}', options) end def top_#{tag_type}(limit = 10) tag_counts_on('#{tag_type}', order: 'count desc', limit: limit.to_i) end def self.top_#{tag_type}(limit = 10) tag_counts_on('#{tag_type}', order: 'count desc', limit: limit.to_i) end RUBY end end |
#safe_to_sql(relation) ⇒ Object
139 140 141 142 143 144 145 146 147 |
# File 'lib/acts_as_taggable_on/taggable/collection.rb', line 139 def safe_to_sql(relation) if connection.respond_to?(:unprepared_statement) connection.unprepared_statement do relation.to_sql end else relation.to_sql end end |
#tag_counts_on(context, options = {}) ⇒ Object
39 40 41 |
# File 'lib/acts_as_taggable_on/taggable/collection.rb', line 39 def tag_counts_on(context, = {}) all_tag_counts(.merge({ on: context.to_s })) end |
#tags_on(context, options = {}) ⇒ Object
43 44 45 |
# File 'lib/acts_as_taggable_on/taggable/collection.rb', line 43 def (context, = {}) (.merge({ on: context.to_s })) end |