Sha256: 756203ba14c1d0655205652bbfe6ffbc9786531b6acafd5e4c798467b5925e4c

Contents?: true

Size: 1.64 KB

Versions: 2

Compression:

Stored size: 1.64 KB

Contents

class Models::Tags < Array
  inherit Mongo::Model

  def initialize array = nil
    super()
    replace array if array
  end

  #
  # Working with context
  #
  class ContextTags < Array
    def as_string; join(", ") end
  end

  def topic
    get_tags{|tag| tag !~ /:/}
  end
  def topic= value
    set_tags(value){|tag| tag !~ /:/}
  end

  def as_string; join(", ") end

  #
  # Updating Tag and counts cache
  #
  attr_accessor :_changes
  before_save do |tags|
    original_tags = (tags._parent && tags._parent.original.try(:tags)) || Models::Tags.new
    tags._changes = [original_tags, tags] if tags != original_tags
  end
  after_save {|tags| Models::Tag.update_tags! *tags._changes if tags._changes}
  after_destroy{|tags| Models::Tag.delete_tags! tags unless tags.empty?}

  protected
    def validate_tag_names
      errors.add :base, t(:invalid_tags) unless all?{|tag| Models::Tag.valid_name?(tag)}
    end
    validate :validate_tag_names

    def method_missing m, *args, &b
      if m !~ /=$/
        context = m.to_s
        args.size.must == 0
        get_tags{|tag| tag =~ /#{context}:/}
      else
        context = m.to_s[0..-2]
        args.size.must == 1
        value = args.first
        set_tags(value){|tag| tag =~ /#{context}:/}
      end
    end

    def set_tags value, &selector
      new_tags = if value.is_a? String
        value.split(Models::Tag::TAG_LIST_DELIMITER).collect{|name| name.strip}.sort
      else
        value.must_be.a Array
      end
      new_tags.select!(&selector)

      reject!(&selector)
      new_tags.each{|tag| push tag}
      sort!
    end

    def get_tags &selector
      ContextTags.new select(&selector)
    end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rad_kit-0.0.10 lib/kit/models/tags.rb
rad_kit-0.0.9 lib/kit/models/tags.rb