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</code>
<code> 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")</code>
<code>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</code>
<code> disable_tags_index! # will disable index creation</code>
<code> 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</code>
<code> tags_separator ';' # will change tags separator to ;</code>
<code> field :title
field :content
end