Module: Mongoid::TaggableOn::ClassMethods

Defined in:
lib/mongoid/taggable_on.rb

Instance Method Summary collapse

Instance Method Details

#split_tag(value) ⇒ Object



105
106
107
# File 'lib/mongoid/taggable_on.rb', line 105

def split_tag(value)
  value.split(%r{,|,|/|\|}).collect(&:strip).uniq
end

#taggable_on(field_name, opts = {}) ⇒ Object

rdoc

Define a tag field

*For example:*

class Person
  include Mongoid::Document
  include Mongoid::TaggableOn
  taggable_on :languages
  taggable_on :skills
end

*Then will has there methods and fields:*

field :languages, :type => Array, :default => []
def language_list; end
def language_list=(value); end
field :skills, :type => Array, :default => []
def skill_list; end
def skill_list=(value); end

Params

* field_name      <em>name for tag field</em>
* opts[:index]    <em>(true/false) allow create index in MongoDB, default: true</em>


69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/mongoid/taggable_on.rb', line 69

def taggable_on(field_name, opts = {})
  field_name = field_name.to_s.tableize
  field_name_single = field_name.singularize

  index_code = ""
  if opts[:index] != false
    index_code = "index({#{field_name}: '2d'}, {background: true})"
  end

  class_eval %{
    field :#{field_name}, :type => Array, :default => []

    #{index_code}

    def #{field_name_single}_list=(value)
      if !value.blank?
        self.#{field_name} = self.class.split_tag(value)
      end
    end

    def #{field_name_single}_list
      return "" if self.#{field_name}.blank?
      self.#{field_name}.join(",")
    end

    def #{field_name_single}_list_was
      return "" if self.#{field_name}_was.blank?
      self.#{field_name}_was.join(",")
    end

    def #{field_name_single}_list_changed?
      self.#{field_name}_changed?
    end
  }
end