Module: ActsAsTaggableOn::Taggable::Collection::ClassMethods
- Defined in:
- lib/acts_as_taggable_on/acts_as_taggable_on/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
31 32 33 34 |
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb', line 31 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.
91 92 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 |
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb', line 91 def all_tag_counts( = {}) .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 joins: taggable_join = "INNER JOIN #{table_name} ON #{table_name}.#{primary_key} = #{ActsAsTaggableOn::Tagging.table_name}.taggable_id" taggable_join << " AND #{table_name}.#{inheritance_column} = '#{name}'" unless descends_from_active_record? # Current model is STI descendant, so add type checking to the join condition ## 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]) # Joins and conditions tagging_scope = tagging_scope.joins(taggable_join) 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"] having.push sanitize_sql(["COUNT(#{ActsAsTaggableOn::Tagging.table_name}.tag_id) >= ?", .delete(:at_least)]) if [:at_least] having.push sanitize_sql(["COUNT(#{ActsAsTaggableOn::Tagging.table_name}.tag_id) <= ?", .delete(:at_most)]) if [:at_most] 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: scoped_select = "#{table_name}.#{primary_key}" tagging_scope = tagging_scope.where("#{ActsAsTaggableOn::Tagging.table_name}.taggable_id IN(#{safe_to_sql(select(scoped_select))})") 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.
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb', line 55 def ( = {}) .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: scoped_select = "#{table_name}.#{primary_key}" tagging_scope = tagging_scope.where("#{ActsAsTaggableOn::Tagging.table_name}.taggable_id IN(#{safe_to_sql(select(scoped_select))})").group(group_columns) tag_scope_joins(tag_scope, tagging_scope) end |
#initialize_acts_as_taggable_on_collection ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb', line 9 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
130 131 132 |
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb', line 130 def safe_to_sql(relation) connection.respond_to?(:unprepared_statement) ? connection.unprepared_statement{relation.to_sql} : relation.to_sql end |
#tag_counts_on(context, options = {}) ⇒ Object
36 37 38 |
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb', line 36 def tag_counts_on(context, = {}) all_tag_counts(.merge({:on => context.to_s})) end |
#tags_on(context, options = {}) ⇒ Object
40 41 42 |
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb', line 40 def (context, = {}) (.merge({:on => context.to_s})) end |