Rails "act-as-taggable-on": как добавить теги * объекты * в taggables, а не по имени
В импортере данных у меня есть код, который пытается добавить кучу объектов ActsAsTaggableOn::Tag
в список тегов taggable:
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
принимает список имен тегов, а не тегов. Есть ли способ добавить объекты тегов? Я не могу найти что-либо в документации, подобной тегам, и его код слишком мал для меня, чтобы понять (например, Tag::concat
, похоже, не мутирует себя!)
Я мог бы сопоставить теги с их именами, но тогда action-as-taggable-on будет запускать канонизацию имени, которая подходит для ввода пользователя, но не для массового импорта данных, поэтому я не хочу этого делать.
Ответы
Ответ 1
Драгоценный камень действительно просто добавляет это для вас:
has_many :taggings
has_many :tags, through: :taggings
(Немного сложнее поддерживать несколько видов тегов, но детали довольно просты.)
Таким образом, вы можете использовать эти ассоциации так же, как и любые другие. В вашем случае это будет что-то вроде:
ActsAsTaggableOn::Tag.where(id: tags_old_to_new(item[:tags], tags))).each do | t|
new_item.tags << t
end