Mongoid Taggable provides some helpers to create taggable documents.
You can simple install from rubygems:
gem install mongoid_taggableor in Gemfile:
gem 'mongoid_taggable'or as a Rails Plugin:
script/plugin install git://github.com/wilkerlucio/mongoid_taggable.gitTo make a document taggable you need to include Mongoid::Taggable into your document:
class Post include Mongoid::Document include Mongoid::Taggablefield :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.
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'])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] # ]
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::Taggabledisable_tags_index! # will disable index creationfield :title field :content end
To change the default separator you may call the tags_separator class method:
class Post include Mongoid::Document include Mongoid::Taggabletags_separator ';' # will change tags separator to ;field :title field :content end