Полиморфный запрос тегов для нескольких объектов

У меня есть Authorмодель , которая has_many :postshas_many :commentsтакже может быть taggableоснована на моделях TaggingandTag, которые я опубликовал ниже.

class Tagging
  belongs_to :tag
  belongs_to :taggable, polymorphic: true
end
class Tag
  has_many :taggings
  has_many :posts, through: :taggings, source: :taggable, source_type: 'Post'
  has_many :authors, through: :taggings, source: :taggable, source_type: 'Author'
end

Вот как Authorвыглядит моя модель.

class Author
  has_many :posts
  has_many :comments
  has_many :taggings, as: :taggable
  has_many :tags, through: :taggings
end

Есть несколько типов запросов, которые я пытаюсь, но все мои попытки вызывают ошибки, и я не могу понять, как добраться до нужных мне данных. В основном я хотел бы выполнить запросы для следующих сценариев:

  • Допустим, у меня есть авторский объект @author = Author.find(1). Как получить все связанные комментарии и сообщения, сгруппированные по тегам, созданным автором? Я не уверен, как построить этот объект AR.
  • Как найти все комментарии и сообщения автора, которые имеют общий тег? Для этого я пытался@taggable = @author.tagging.joins(:tag).where(tags: {name: @tag_name}), но не могу этого сделать.

Спасибо

1 ответ

  1. Если вы используете gem acts_as_taggable, то его легко найти тегируемые записи с помощью утилиты tagged_with.

    ##get the author
    @author = Author.find params[:id]
    ##get the authors category/tags
    cat = @author.tags
    ##find all post/comments that are tagged with cat
    Author.includes(:post, :comments, :tags).tagged_with(cat,:any=>true)}.flatten.compact.uniq
    

    Если вы не используете acts_as_taggable :(,то вам придется создать свой собственный запрос…которая может быть такой..

    Author.includes(:post, :comments, :tags).where(tags: {taggable_type: 'Author',taggable_id: @author.id}).flatten.compact.uniq