Categoryz3

<img src=“https://secure.travis-ci.org/tscolari/categoryz3.png” /> <img src=“https://codeclimate.com/badge.png” />

__Version 0.9+ is rails4 compatible__

Simple categorization to ActiveRecord models.

Works like a simple tagging system, but instead of tags it has categories, and categories may have an ilimited level of subcategories.

Fetches items in any level of subcategories with a single join.

Motivation

genres_category      = Categoryz3::Category.create(name: 'genres')
horror_category      = Categoryz3::Category.create(name: 'horror', parent: genres_category)
cult_horror_category = Categoryz3::Category.create(name: 'horror', parent: horror_category)
action_category      = Categoryz3::Category.create(name: 'horror', parent: genres_category)

horror_movie = Movie.find(1)
horror_movie.categories << cult_horror_category
horror_movie.categories
#=> [cult_horror_category]

action_movie = Movie.find(2)
action_movie.categories << action_category

Movie.inside_category(genres_category).all
#=> [horror_movie, action_movie]
Movie.inside_category(horror_category).all
#=> [horror_movie]
Movie.inside_category(cult_horror_category).all
#=> [horror_movie]

horror_category.path
#=> [movie_category, horror_category]

Installation

Insert the gem in your Gemfile:

gem 'categoryz3'

Generate and run the migrations:

rails g categoryz3:migrations
rake db:migrate

Include the categorizable module in the models you want to categorize:

class Article < ActiveRecord::Base
  include Categoryz3::Categorizable
end

Usage

Listing categories from an object

You can use the relation ‘categories` to list all categories from a model:

model.categories
#=> [category1, category2]

You can also use the ‘categories_list`, this will return the categories ids:

model.categories_list
#=> "1, 2"

Adding categories to an object

There are 2 ways for adding categories to an object:

model.categories << category
model.categories_list = "1, 2, 3"

Removing categories from an object

To remove a category from the model, you can use the ‘remove_category` method:

model.remove_category category
model.remove_categories category1, category2

Category Path

Lists all the categories in the path, from the root one, to the category:

category.path
#=> [root_category, some_subcategory, another_subcategory, category]

Categorizable Scopes

inside_category

Lists all objects that belongs to the category or any subcategory of it

Article.inside_category(category)

having_category

Lists all objects that belongs to the category. (No subcategory objects).

Article.having_category(category)

License

MIT License. Copyright 2012 Tiago Scolari.