Подтвердить что ты не робот

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 будет запускать канонизацию имени, которая подходит для ввода пользователя, но не для массового импорта данных, поэтому я не хочу этого делать.

4b9b3361

Ответ 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