Вернуть все теги в зависимости от контекста - ActsAsTaggableOn - PullRequest
10 голосов
/ 24 августа 2011

Я использую гем rails Act-as-Taggable и помечаю сообщения в двух контекстах: теги и темы.

Чтобы вернуть хэш всех тегов тем, которые использовались до сих пор для сообщений Iможно использовать код:

 Post.tag_counts_on(:topics)

Однако я создал определенное количество заданных тегов тем, и если некоторые из этих тегов тем в настоящее время не используются в качестве тегов для сообщений, приведенный выше кодне возвращать упомянутые темы.

Мне интересно, есть ли способ вернуть все соответствующие теги на основе контекста - я надеялся найти решение в духе:

 topics = Tag.topics

Для реализации решения я создал модель Tag.rb:

 class Tag < ActiveRecord::Base
   has_many :relationship_topics, :foreign_key => "topic_followed_id", :dependent => :destroy
   has_many :topic_followers, :through => :relationship_topics, :source => :topic_follower
 end

Здесь у меня есть код, позволяющий использовать следующие темы, но не более того.

Кто-нибудь знает, как яможет вернуть все теги в зависимости от контекста?

Ответы [ 4 ]

16 голосов
/ 24 августа 2011

Я никогда не использовал actions-as-taggable-on , но быстрый просмотр кода показывает, что вы можете сделать:

# to get all the tags with context topic with counts
ActsAsTaggableOn::Tagging.
    includes(:tag).
    where(:context => "topics").
    group("tags.name").
    select("tags.name, COUNT(*) as count")

Вам, вероятно, следует взглянуть на ActsAsTaggableOn :: Tagging , ActsAsTaggableOn :: Tag и файл миграции в папке db / migrations, чтобы выяснить, как это можно сделать. .

Если вы не хотите считать, только имена тегов:

tags = ActsAsTaggableOn::Tag.includes(:taggings).
           where("taggings.context = 'topics'").
           select("DISTINCT tags.*")

# usage
tags.each {|tag| puts tag.name}

Надеюсь, это ответит на ваш вопрос.

0 голосов
/ 28 января 2017

Метод очень прост:

ActsAsTaggableOn::Tag.for_context('topics')
0 голосов
/ 07 апреля 2016

Это лучше всего сработало для меня:

ActsAsTaggableOn::Tag.includes(:taggings).where(taggings:{context:'topics'}).uniq(:name).order(:name)

Одно ограничение при выполнении joins или includes с контекстом тегов - это то, что вы будете видеть только активные темы.Вы не можете загрузить список тем, чтобы они отображались с помощью этого запроса.См. Примеры:

Без контекста тегов

2.2.1 :009 > ActsAsTaggableOn::Tag.includes(:taggings)
  ActsAsTaggableOn::Tag Load (0.4ms)  SELECT `tags`.* FROM `tags`
  ActsAsTaggableOn::Tagging Load (0.4ms)  SELECT `taggings`.* FROM `taggings` WHERE `taggings`.`tag_id` IN (1, 2, 3)
[
    [0] severe hearing loss {
                    :id => 1,
                  :name => "severe hearing loss",
        :taggings_count => 0
    },
    [1] hearing loss {
                    :id => 2,
                  :name => "hearing loss",
        :taggings_count => 1
    },
    [2] hearing aids {
                    :id => 3,
                  :name => "hearing aids",
        :taggings_count => 0
    }
]

С контекстом тегов topics

2.2.1 :016 > ActsAsTaggableOn::Tag.includes(:taggings).where(taggings:{context:'topics'})
  SQL (0.4ms)  SELECT `tags`.`id` AS t0_r0, `tags`.`name` AS t0_r1, `tags`.`taggings_count` AS t0_r2, `taggings`.`id` AS t1_r0, `taggings`.`tag_id` AS t1_r1, `taggings`.`taggable_id` AS t1_r2, `taggings`.`taggable_type` AS t1_r3, `taggings`.`tagger_id` AS t1_r4, `taggings`.`tagger_type` AS t1_r5, `taggings`.`context` AS t1_r6, `taggings`.`created_at` AS t1_r7 FROM `tags` LEFT OUTER JOIN `taggings` ON `taggings`.`tag_id` = `tags`.`id` WHERE `taggings`.`context` = 'topics'
[
    [0] hearing loss {
                    :id => 2,
                  :name => "hearing loss",
        :taggings_count => 1
    }
]
0 голосов
/ 11 апреля 2014

Использовать Model.tag_counts (из Использование актов-как-тегов-как, как найти топ, скажем, 10, тегов в моем приложении? ):

User.skill_counts # => [<Tag name="joking" count=2>,<Tag name="clowning" count=1>...]
...