我也遇到了同样的问题。在进行了一些试验和错误之后,我想出了以下方法,通读有关固定装置、关联和@barnaclebarnes 对这个问题的回答的文档。
我用 rails 4.2.0 和 acts-as-taggable-on 3.5.0 做到了这一点。
备注:
我之前的回答起到了作用,但有点古怪。在@David 向我指出一种更简洁的方式之后,我完全重写了它——完全省略了我的反复试验并坚持解决方案。
一种促进更多轨道车载设施的方法
@barnaclebarnes 解决方案将提供更多的自动化,但也意味着更多的 id 输入和簿记。所以我一直在寻找更简洁的方法。
多态关系
acts_as_taggable_on 使用名为taggable 的多态关系来实现标签与不同模型之间的关系。有关 polymorphic relations 的详细信息,请参阅有关关联的 rails 指南。
高级夹具
ActiveRecord::FixtureSet 的 rubydoc 描述了 ActiveRecord 的工作原理以及它对夹具关系的作用(章节 关联的标签引用):
Active Record 反映fixture 的模型类,查找所有belongs_to 关联,并允许您为关联[...] 指定目标标签,而不是FK [...] 的目标ID。
页面再往下一点,还有一些关于多态belongs_to的细节。
这将允许像这样的标记夹具定义:
tagging:
taggable: foo (Klass)
context: tags
tag: bar
命名空间夹具和模型
ActiveRecord::TestFixtures 提供了一种方法来显式设置夹具的模型类,以防无法推断。
换句话说:您可以使用目录来命名固定装置并将它们与其命名空间模型相匹配。
要加载acts_as_taggable_on 的标签和标记的测试数据,我们可以将它们的fixture 放在子文件夹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 文件进行 erb 处理,则可以对可标记模型及其实例进行相当低的维护定义。