我正在使用 acts_as_taggable_on为我的 Framework
模型提供标记的插件。我有 Rails 生成的功能测试,以及它使用的固定装置,我想扩展它们以添加一些标签,以便我可以测试按标签搜索等。
我是否必须为 taggings
和 tag
表创建固定装置并将它们加载到我的功能测试的顶部?如果是这样,我该怎么做?我还没有弄清楚 here 中描述的关系的语法.另一种方法是获取 Framework
实例并在测试搜索行为之前向其添加标签吗?或者,如果我这样做,Rails 之神会打败我吗?
最佳答案
我遇到了同样的问题。在我进行了一些反复试验之后,我想出了以下方法,通读了有关固定装置、关联和@barnaclebarnes 对这个问题的回答的文档。
我用 rails 4.2.0 和 acts-as-taggable-on 3.5.0 做到了这一点。
备注: 我之前的回答成功了,但有点古怪。在@David 向我指出一种更简洁的方法后,我完全重写了它 - 完全省略了我的反复试验并坚持解决方案。
一种促进更多 rails 车载设施的方法
@barnaclebarnes 解决方案会提供更多的自动化,但也意味着更多的 id 打字和簿记。所以我一直在寻找更简洁的方法。
多态关系
acts_as_taggable_on 使用名为 taggable 的多态关系来实现标签与不同模型之间的关系。有关 polymorphic relations 的详细信息,请参阅关于关联的 Rails 指南.
高级 fixture
ActiveRecord::FixtureSet 的 rubydoc描述了 ActiveRecord 的工作原理以及它如何处理固定装置的关系(第 关联标签引用 章):
Active Record reflects on the fixture's model class, finds all the belongs_to associations, and allows you to specify a target label for the association [...] rather than a target id for the FK [...].
在页面的下方,还有一些关于多态 belongs_to 的详细信息。
这将允许像这样的标记 fixture 定义:
tagging:
taggable: foo (Klass)
context: tags
tag: bar
命名空间装置和模型
ActiveRecord::TestFixtures提供一种方法来显式设置 fixture 的模型类,以防无法推断。
换句话说:您可以使用目录来命名装置并将它们与它们的命名空间模型相匹配。
要为 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 文件,这允许对可标记模型及其实例进行相当低的维护定义。
关于ruby-on-rails - 使用 acts_as_taggable_on 为模型创建 fixture 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4071205/