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.1"}]
  end
  1. Configure Taglet to use your repo in config/config.exs:
  config :taglet, repo: ApplicationName.Repo
  1. Install your dependencies:

    mix deps.get

  2. Generate the migrations:

    mix taglet.install

  3. 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