Я столкнулся с той же проблемой.Я предложил следующий подход после проб и ошибок, прочитал документацию о приспособлениях, ассоциациях и @barnaclebarnes ответ на этот вопрос.
Я сделал это с rails 4.2.0 и действует-как-помечено-включено 3.5.0 .
Примечание: Мой предыдущий ответ сработал, но был немного странным.Я полностью переписал его после того, как @David указал мне более чистый путь - полностью опустил мой метод проб и ошибок и остановился на решении.
Подход, облегчающий большее количество встроенных средств рельсов
Решение @barnaclebarnes обеспечило бы немного больше автоматизма, но также означало бы гораздо больше ввода и учета идентификаторов.Поэтому я продолжал искать более сжатый способ.
Полиморфные отношения
acts_as_taggable_on использует полиморфное отношение с именем taggable для реализации связи между тегами иразные модели.Подробнее о полиморфных отношениях .
Advanced Fixtures
см. Руководство по ActiveRecord :: FixtureSet , описывающее работу ActiveRecord.и что он делает с отношениями приборов (глава Ссылки на метки для ассоциаций ):
Active Record отражает класс модели прибора, находит все ассоциации own_to и позволяет вамукажите целевую метку для ассоциации [...], а не целевой идентификатор для FK [...].
Чуть ниже на странице, есть также некоторые подробности о полиморфностиassign_to.
Это позволило бы определить определение устройства тегирования следующим образом:
tagging:
taggable: foo (Klass)
context: tags
tag: bar
Приборы и модели с пространством имен
ActiveRecord :: TestFixtures обеспечиваетМетод явной установки класса модели для прибора в случае, если он не может быть выведен.Другими словами: вы можете использовать каталоги для фиксации пространства имен и сопоставления их с моделями пространства имен.Чтобы загрузить тестовые данные для тегов и тегов act_as_taggable_on, мы можем поместить их приборы в подпапку fixtures/acts_as_taggable_on/
( Примечание : fixtures/ActsAsTaggableOn/
также будет работать)
Соберите все вместе
# models/item.rb
class Item < ActiveRecord::Base
acts_as_taggable_on
end
# fixtures/items.yml
item_1: {}
item_2: {}
# fixtures/acts_as_taggable_on/tags.yml
tag_1:
name: tag_1
tag_2:
name: tag_2
# fixtures/acts_as_taggable_on/taggings.yml
tagging_1
taggable: item_1 (Item)
context: tags
tag: tag_1
Если вы добавляете файлы yaml, это позволяет получить довольно низкое определение обслуживания для тегируемых моделей и их экземпляров.