Class: ActsAsTaggableOn::Tag

Inherits:
ActiveRecord::Base
  • Object
show all
Includes:
Utils
Defined in:
lib/acts_as_taggable_on/tag.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Utils

included

Class Method Details

.find_or_create_all_with_like_by_name(*list) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/acts_as_taggable_on/tag.rb', line 70

def self.find_or_create_all_with_like_by_name(*list)
  list = Array(list).flatten

  return [] if list.empty?

  existing_tags = Tag.named_any(list)

  list.map do |tag_name|
    comparable_tag_name = comparable_name(tag_name)
    existing_tag = existing_tags.detect { |tag| comparable_name(tag.name) == comparable_tag_name }

    existing_tag || Tag.create(:name => tag_name)
  end
end

.find_or_create_with_like_by_name(name) ⇒ Object

CLASS METHODS:



62
63
64
65
66
67
68
# File 'lib/acts_as_taggable_on/tag.rb', line 62

def self.find_or_create_with_like_by_name(name)
  if (ActsAsTaggableOn.strict_case_match)
    self.find_or_create_all_with_like_by_name([name]).first
  else
    named_like(name).first || create(:name => name)
  end
end

.named(name) ⇒ Object

SCOPES:



25
26
27
28
29
30
31
# File 'lib/acts_as_taggable_on/tag.rb', line 25

def self.named(name)
  if ActsAsTaggableOn.strict_case_match
    where(["name = #{binary}?", name])
  else
    where(["lower(name) = ?", name.downcase])
  end
end

.named_any(list) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/acts_as_taggable_on/tag.rb', line 33

def self.named_any(list)
  if ActsAsTaggableOn.strict_case_match
    clause = list.map { |tag|
      sanitize_sql(["name = #{binary}?", as_8bit_ascii(tag)])
    }.join(" OR ")
    where(clause)
  else
    clause = list.map { |tag|
      lowercase_ascii_tag = as_8bit_ascii(tag).downcase
      sanitize_sql(["lower(name) = ?", lowercase_ascii_tag])
    }.join(" OR ")
    where(clause)
  end
end

.named_like(name) ⇒ Object



48
49
50
51
# File 'lib/acts_as_taggable_on/tag.rb', line 48

def self.named_like(name)
  clause = ["name #{like_operator} ? ESCAPE '!'", "%#{escape_like(name)}%"]
  where(clause)
end

.named_like_any(list) ⇒ Object



53
54
55
56
57
58
# File 'lib/acts_as_taggable_on/tag.rb', line 53

def self.named_like_any(list)
  clause = list.map { |tag|
    sanitize_sql(["name #{like_operator} ? ESCAPE '!'", "%#{escape_like(tag.to_s)}%"])
  }.join(" OR ")
  where(clause)
end

Instance Method Details

#==(object) ⇒ Object

INSTANCE METHODS:



87
88
89
# File 'lib/acts_as_taggable_on/tag.rb', line 87

def ==(object)
  super || (object.is_a?(Tag) && name == object.name)
end

#countObject



95
96
97
# File 'lib/acts_as_taggable_on/tag.rb', line 95

def count
  read_attribute(:count).to_i
end

#to_sObject



91
92
93
# File 'lib/acts_as_taggable_on/tag.rb', line 91

def to_s
  name
end

#validates_name_uniqueness?Boolean

monkey patch this method if don’t need name uniqueness validation

Returns:

  • (Boolean)


19
20
21
# File 'lib/acts_as_taggable_on/tag.rb', line 19

def validates_name_uniqueness?
  true
end