Search code examples
tagsruby-on-rails-5act-as-taggable-on

How to display all of tags using act_as_taggable_on rails


Im Using Rails 5.1 , and i use acts-as-taggable-on gem https://rubygems.org/gems/acts-as-taggable-on inside my post model.

I want to ask how to display all list of my tags inside my posts index ?

For example. I have tags named shoes, wallet, watch. I want to show those tags in my post index. When i clicked shoes,it will render all posts that linked with shoes tag.

My Schema:

    create_table "taggings", id: :serial, force: :cascade do |t|
    t.integer "tag_id"
    t.string "taggable_type"
    t.integer "taggable_id"
    t.string "tagger_type"
    t.integer "tagger_id"
    t.string "context", limit: 128
    t.datetime "created_at"
    t.index ["context"], name: "index_taggings_on_context"
    t.index ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true
    t.index ["tag_id"], name: "index_taggings_on_tag_id"
    t.index ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context"
    t.index ["taggable_id", "taggable_type", "tagger_id", "context"], name: "taggings_idy"
    t.index ["taggable_id"], name: "index_taggings_on_taggable_id"
    t.index ["taggable_type"], name: "index_taggings_on_taggable_type"
    t.index ["tagger_id", "tagger_type"], name: "index_taggings_on_tagger_id_and_tagger_type"
    t.index ["tagger_id"], name: "index_taggings_on_tagger_id"
  end

My post controller

def index
    @posts = Post.list_for(params[:page], params[:tag]).search(params[:search])
end

Thank you for helping me.


Solution

  • Retrieve all tags:

    ActsAsTaggableOn::Tag.all
    

    Check this link for more info: https://github.com/mbleigh/acts-as-taggable-on/wiki/Tutorial-for-Posts#controller

    There also possible to retrieve tags by context, check this: https://github.com/mbleigh/acts-as-taggable-on/wiki/Get-all-tags-by-context

    Notice!

    ActsAsTaggableOn::Tag
    

    is a simple ActiveRecord model. So you can invoke query on it like:

    existing_posts_tags = ActsAsTaggableOn::Tag.joins(:taggings).where(taggings: { teggable_type: 'Post' })