在数据导入器中,我的代码试图将一堆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会运行适合用户输入的名称规范化,但不适合批量数据导入,所以我不想这样做。
答案 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