CircleCI

Taglet

Taglet allows you to manage tags associated to your records.

It also allows you to specify various contexts

Installation

  1. Add taglet to your list of dependencies in mix.exs:
def deps do
[{:taglet, "~> 0.4.0"}]
end
  1. Configure Taglet to use your repo in config/config.exs:
config :taglet, repo: ApplicationName.Repo
  1. Install your dependencies:

mix deps.get

  1. Generate the migrations:

mix taglet.install

  1. Run the migrations:

mix ecto.migrate

Include it in your models

Now, you can use the library in your models.

You should add the next line to your taggable model:

use Taglet.TagAs, :tag_context_name

i.e.:

defmodule Post do
use Ecto.Schema
use Taglet.TagAs, :tags
use Taglet.TagAs, :categories
import Ecto.Changeset
schema "posts" do
field :title, :string
field :body, :boolean
timestamps()
end
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:title, :body])
|> validate_required([:title])
end
end

As you can see, we have included two different contexts, tags and categories

Now we can use a set of metaprogrammed functions:

Post.add_category(struct, tag) - Passing a persisted struct will allow you to associate a new tag

Post.add_categories(struct, tags) - Passing a persisted struct will allow you to associate a new list of tags

Post.remove_category(struct, tag) - Will allow you to remove a tag

Post.categories_list(struct) - List all associated tags with the given struct

Post.categories - List all associated tags with the module

Post.tagged_with_category(tag) - Search for all resources tagged with the given tag

Post.tagged_with_categories(tags) - Search for all resources tagged with the given list tag

Post.tagged_with_query_category(queryable, tags) - Allow to concatenate ecto queries and return the query.

Post.tagged_with_query_categories(queryable, tags) - Same than previous function but allow to receive a list of tags

Working with functions

If you want you can use directly a set of functions to play with tags:

Taglet.add/3

Taglet.remove/3

Taglet.tag_list/2

Taglet.tagged_with/3

Taglet.tagged_with_query/3