Это лучше всего сработало для меня:
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
}
]