Rails“act-as-taggable-on”:如何将tag * objects *添加到taggables,而不是名称

时间:2017-12-10 15:16:38

标签: ruby-on-rails acts-as-taggable-on

在数据导入器中,我的代码试图将一堆ActsAsTaggableOn::Tag 对象添加到可标记的标记列表中:

    existing_item = FeedItem.where(url: item[:url]).first

    if existing_item.nil?
      new_item = FeedItem.new

      new_item.attributes = item.except(:id, :feeds)

      new_item.feeds = Feed.where(id: feeds_old_to_new(item_feeds, feeds))
      new_item.tag_list.add(
          ActsAsTaggableOn::Tag.where(id: tags_old_to_new(item[:tags], tags)))

      new_item.save!
   else
      # ... merge imported record with existing item ...
   end

这不起作用,因为tag_list.add会获取标记名称的列表,而不会标记对象。有没有办法添加标签对象?我在act-as-taggable-on文档中找不到任何内容,而且它的代码对我来说太难理解了(例如,Tag::concat似乎不会改变自己!)

我可以将标签映射到它们的名称,但是act-as-taggable-on会运行适合用户输入的名称规范化,但不适合批量数据导入,所以我不想这样做。

1 个答案:

答案 0 :(得分:3)

宝石真的只是为你添加这个:

has_many :taggings
has_many :tags, through: :taggings

(支持多种标签有点复杂,但the details非常简单。)

所以你可以像其他任何一样使用这些关联。在你的情况下它会是这样的:

ActsAsTaggableOn::Tag.where(id: tags_old_to_new(item[:tags], tags))).each do | t|
  new_item.tags << t
end