首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在测试夹具中使用acts as-taggable-on?

如何在测试夹具中使用acts as-taggable-on?
EN

Stack Overflow用户
提问于 2016-03-18 00:18:49
回答 2查看 485关注 0票数 0

看起来,acts as-taggable-on在它建立的数据表中使用了多态关系。如何让它与minitest中的fixture一起工作?

我有一个实现acts-as-taggableLead模型。这看起来像是在模型中添加了以下内容:

代码语言:javascript
复制
has_many :taggings, :as => :taggable, :dependent => :destroy, :class_name => "ActsAsTaggableOn::Tagging"
has_many :base_tags, :through => :taggings, :source => :tag, :class_name => "ActsAsTaggableOn::Tag"

我的销售线索表:

代码语言:javascript
复制
  create_table "leads", force: true do |t|
    t.string   "name"
    t.string   "email"
    t.string   "phone"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "user_id"
  end

由acts as-taggable-on创建的表:

代码语言:javascript
复制
  create_table "taggings", force: true do |t|
    t.integer  "tag_id"
    t.integer  "taggable_id"
    t.string   "taggable_type"
    t.integer  "tagger_id"
    t.string   "tagger_type"
    t.string   "context",       limit: 128
    t.datetime "created_at"
  end

  add_index "taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true, using: :btree

  create_table "tags", force: true do |t|
    t.string "name"
  end

  add_index "tags", ["name"], name: "index_tags_on_name", unique: true, using: :btree

gem中有一个标签类,它包括:

代码语言:javascript
复制
belongs_to :tag, :class_name => 'ActsAsTaggableOn::Tag'
belongs_to :taggable, :polymorphic => true
belongs_to :tagger,   :polymorphic => true

下面是我的fixtures在多态关系的rails api docs中的样子:

代码语言:javascript
复制
# leads.yml
onetag1:
  name: "OneTag1 Lead"
  email: "lead@onetag1email.com"
  phone: "14120006002"
  base_tags: one
onetag2:
  name: "OneTag2 Lead"
  email: "lead@onetag2email.com"
  phone: "14120006003"

# taggings.yml
one:
  tag: one
  taggable: onetag1 (Lead)
two:
  tag: two
  taggable: onetag2 (Lead)

# tags.yml
one:
  name: "Tag one"
two:
  name: "Tag two"

但我得到了:

代码语言:javascript
复制
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column "tag" of relation "taggings" does not exist
LINE 1: INSERT INTO "taggings" ("tag", "taggable") VALUES ('one', 'o...
                                ^
: INSERT INTO "taggings" ("tag", "taggable") VALUES ('one', 'onetag1 (Lead)')

我也试过了:

代码语言:javascript
复制
# taggings.yml
one:
  taggable: onetag1 (Lead)
two:
  taggable: onetag2 (Lead)

而不引用tag。但我得到的是:

代码语言:javascript
复制
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column "taggable" of relation "taggings" does not exist
LINE 1: INSERT INTO "taggings" ("taggable") VALUES ('onetag1 (Lead)'...
                                ^
: INSERT INTO "taggings" ("taggable") VALUES ('onetag1 (Lead)')

我遗漏了什么?如何将标签与装置中的引线相关联?

EN

回答 2

Stack Overflow用户

发布于 2017-03-10 04:11:51

我知道这很古老,但是对于通过搜索发现这一点的任何人来说,这里有解决方案(至少在Rails 5中是这样)。

关键在于Rails围绕文件夹和类名的魔力。因为在ActsAsTaggableOn名称空间下创建模块,所以需要在名为acts_as_taggable_on的子文件夹中创建fixture

夹具数据

在fixtures文件夹下,与添加标签相关的fixture应位于如下所示的路径中:

代码语言:javascript
复制
# acts_as_taggable_on/taggings.yml
one:
  tag: one
  taggable: onetag1 (Lead)
two:
  tag: two
  taggable: onetag2 (Lead)

# acts_as_taggable_on/tags.yml
one:
  name: "Tag one"
two:
  name: "Tag two"

测试用例中的Fixtures

要在测试用例中检索标记或标记,请使用以下方法:

代码语言:javascript
复制
setup do
  @tag = acts_as_taggable_on_tags(:one)
  @tagging = acts_as_taggabe_on_taggings(:one)
end
票数 3
EN

Stack Overflow用户

发布于 2021-08-28 19:29:15

Ryan的回答大体上是正确的,但您可能还需要在您的标记装置上指定上下文,如下所示。

代码语言:javascript
复制
# acts_as_taggable_on/taggings.yml
one:
  tag: one
  taggable: onetag1 (Lead)
  context: tags
two:
  tag: two
  taggable: onetag2 (Lead)
  context: tags

标记fixture也有一个计数器缓存

代码语言:javascript
复制
# acts_as_taggable_on/tags.yml
one: 
  name: tag one
  taggings_count: 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36066168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档