Tags_Multi_Tenant

CircleCI

Tags_Multi_Tenant allows you to manage tags associated to your records.

It also allows you to specify various contexts

Installation

  1. Add tags_multi_tenant to your list of dependencies in mix.exs:
def deps do
[{:tags_multi_tenant, "~> 0.6.0"}]
end
  1. Configure Tags_Multi_Tenant to use your repo in config/config.exs:
# Options
# taggable_id - This field is default :integer, but you can set it as :uuid
config :tags_multi_tenant,
repo: ApplicationName.Repo,
taggable_id: :uuid
  1. Install your dependencies:

mix deps.get

  1. Generate the migrations:

mix tags_multi_tenant.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 Tags_Multi_Tenant.TagAs, :tag_context_name

i.e.:

defmodule Post do
use Ecto.Schema
use Tags_Multi_Tenant.TagAs, :tags
use Tags_Multi_Tenant.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.add_category(tag) - Add a Tag without associate it to a persisted struct, this allow you have tags availables in the context. Example using Post.categories

Post.remove_category(struct, tag) - Will allow you to remove the relation struct - tag, but the tag will persist.

Post.remove_category(tag) - Will allow you to remove a tag in the context Post - category. Tag and relations with Post will be deleted.

Post.rename_category(old_tag, new_tag) - Will allow you to rename the tag name.

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

Post.categories - List all associated tags with the module

Post.categories_queryable - Same as Post.categories but it returns a queryable instead of a list.

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:

Tags_Multi_Tenant.add/4

Tags_Multi_Tenant.remove/4

Tags_Multi_Tenant.rename/5

Tags_Multi_Tenant.tag_list/3

Tags_Multi_Tenant.tag_list_queryable/2

Tags_Multi_Tenant.tagged_with/4

Tags_Multi_Tenant.tagged_with_query/3