No commit activity in last 3 years
No release in over 3 years
There's a lot of open issues
Mongoid Taggable provides some helpers to create taggable documents.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 0.8.7
~> 2.1.0

Runtime

~> 2.0.0.beta.20
 Project Readme

Mongoid Taggable

Mongoid Taggable provides some helpers to create taggable documents.

Installation

You can install from rubygems:

gem install mongoid_taggable

or in Gemfile:

gem 'mongoid_taggable'

or as a Rails Plugin:

script/plugin install git://github.com/wilkerlucio/mongoid_taggable.git

Mongoid 2 vs Mongoid 3

All gem versions less than 1.x only support Mongoid 2 while versions 1.x and greater support Mongoid 3.

Basic Usage

To make a document taggable you need to include Mongoid::Taggable into your document:

class Post
  include Mongoid::Document
  include Mongoid::Taggable

  field :title
  field :content
end

And in your form:

<% form_for @post do |f| %>
  <p>
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </p>
  <p>
    <%= f.label :content %><br />
    <%= f.text_area :content %>
  </p>
  <p>
    <%= f.label :tags %><br />
    <%= f.text_field :tags %>
  </p>
  <p>
    <button type="submit">Send</button>
  </p>
<% end %>

In this case, the text fields for tags should receive the list of tags separated by comma (See below for how to change the separator).

Then your document will have the tags and tags_array getter and setter. tags is as a plain string with tags separated by comma, and tags_array an array representation.

Finding Objects by Tag

Tagged models get a scope called tagged_with, tagged_with_all, and tagged_with_any:

MyModel.tagged_with('foo')
MyModel.published.tagged_with('foo').count
MyModel.tagged_with_all('foo', 'bar')
MyModel.tagged_with_all(['foo', 'bar'])
MyModel.tagged_with_any('foo', 'bar')
MyModel.tagged_with_any(['foo', 'bar'])

Tags Indexing

This module will automatically create an index of tags and their counts for you after saving the document. This can be used for a tag cloud. See the following example to understand how to use it:

Post.create!(:tags => "food,ant,bee")
Post.create!(:tags => "juice,food,bee,zip")
Post.create!(:tags => "honey,strip,food")

Post.tags # will retrieve ["ant", "bee", "food", "honey", "juice", "strip", "zip"]
Post.tags_with_weight # will retrieve:
# [
#   ['ant', 1],
#   ['bee', 2],
#   ['food', 3],
#   ['honey', 1],
#   ['juice', 1],
#   ['strip', 1],
#   ['zip', 1]
# ]

The tags index is unaffected by default_scopes. If enabled, all tags will be indexed regardless of other attribute values.
p. If you don’t want to use this feature, it is good to disable it to improve performance:

class Post
  include Mongoid::Document
  include Mongoid::Taggable

  disable_tags_index! # will disable index creation

  field :title
  field :content
end

Changing default separator

To change the default separator you may call the tags_separator class method:

class Post
  include Mongoid::Document
  include Mongoid::Taggable

  tags_separator ';' # will change tags separator to ;

  field :title
  field :content
end