Module: ActsAsTaggableOn::Taggable::Core::InstanceMethods

Defined in:
lib/acts_as_taggable_on/acts_as_taggable_on/core.rb

Instance Method Summary collapse

Instance Method Details

#add_custom_context(value) ⇒ Object



143
144
145
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 143

def add_custom_context(value)
  custom_contexts << value.to_s unless custom_contexts.include?(value.to_s) or self.class.tag_types.map(&:to_s).include?(value.to_s)
end

#all_tags_list_on(context) ⇒ Object



166
167
168
169
170
171
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 166

def all_tags_list_on(context)
  variable_name = "@all_#{context.to_s.singularize}_list"
  return instance_variable_get(variable_name) if instance_variable_get(variable_name)

  instance_variable_set(variable_name, ActsAsTaggableOn::TagList.new(all_tags_on(context).map(&:name)).freeze)
end

#all_tags_on(context) ⇒ Object

Returns all tags of a given context



175
176
177
178
179
180
181
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 175

def all_tags_on(context)
  tag_table_name = ActsAsTaggableOn::Tag.table_name
  tagging_table_name = ActsAsTaggableOn::Tagging.table_name

  opts =  ["#{tagging_table_name}.context = ?", context.to_s]
  base_tags.where(opts).order("max(#{tagging_table_name}.created_at)").group("#{tag_table_name}.id, #{tag_table_name}.name").all
end

#cached_tag_list_on(context) ⇒ Object



147
148
149
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 147

def cached_tag_list_on(context)
  self["cached_#{context.to_s.singularize}_list"]
end

#custom_contextsObject



135
136
137
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 135

def custom_contexts
  @custom_contexts ||= []
end

#grouped_column_names_for(object) ⇒ Object

all column names are necessary for PostgreSQL group clause



131
132
133
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 131

def grouped_column_names_for(object)
  self.class.grouped_column_names_for(object)
end

#is_taggable?Boolean

Returns:

  • (Boolean)


139
140
141
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 139

def is_taggable?
  self.class.is_taggable?
end

#reload(*args) ⇒ Object



200
201
202
203
204
205
206
207
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 200

def reload(*args)
  self.class.tag_types.each do |context|
    instance_variable_set("@#{context.to_s.singularize}_list", nil)
    instance_variable_set("@all_#{context.to_s.singularize}_list", nil)
  end

  super(*args)
end

#save_tagsObject



209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 209

def save_tags
  tagging_contexts.each do |context|
    next unless tag_list_cache_set_on(context)

    tag_list = tag_list_cache_on(context).uniq

    # Find existing tags or create non-existing tags:
    tag_list = ActsAsTaggableOn::Tag.find_or_create_all_with_like_by_name(tag_list)

    current_tags = tags_on(context)
    old_tags     = current_tags - tag_list
    new_tags     = tag_list     - current_tags
    
    # Find taggings to remove:
    old_taggings = taggings.where(:tagger_type => nil, :tagger_id => nil,
                                  :context => context.to_s, :tag_id => old_tags).all

    if old_taggings.present?
      # Destroy old taggings:
      ActsAsTaggableOn::Tagging.destroy_all :id => old_taggings.map(&:id)
    end

    # Create new taggings:
    new_tags.each do |tag|
      taggings.create!(:tag_id => tag.id, :context => context.to_s, :taggable => self)
    end
  end

  true
end

#set_tag_list_on(context, new_list) ⇒ Object



189
190
191
192
193
194
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 189

def set_tag_list_on(context, new_list)
  add_custom_context(context)

  variable_name = "@#{context.to_s.singularize}_list"
  instance_variable_set(variable_name, ActsAsTaggableOn::TagList.from(new_list))
end

#tag_list_cache_on(context) ⇒ Object



156
157
158
159
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 156

def tag_list_cache_on(context)
  variable_name = "@#{context.to_s.singularize}_list"
  instance_variable_get(variable_name) || instance_variable_set(variable_name, ActsAsTaggableOn::TagList.new(tags_on(context).map(&:name)))
end

#tag_list_cache_set_on(context) ⇒ Object



151
152
153
154
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 151

def tag_list_cache_set_on(context)
  variable_name = "@#{context.to_s.singularize}_list"
  !instance_variable_get(variable_name).nil?
end

#tag_list_on(context) ⇒ Object



161
162
163
164
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 161

def tag_list_on(context)
  add_custom_context(context)
  tag_list_cache_on(context)
end

#tagging_contextsObject



196
197
198
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 196

def tagging_contexts
  custom_contexts + self.class.tag_types.map(&:to_s)
end

#tags_on(context) ⇒ Object

Returns all tags that are not owned of a given context



185
186
187
# File 'lib/acts_as_taggable_on/acts_as_taggable_on/core.rb', line 185

def tags_on(context)
  base_tags.where(["#{ActsAsTaggableOn::Tagging.table_name}.context = ? AND #{ActsAsTaggableOn::Tagging.table_name}.tagger_id IS NULL", context.to_s]).all
end