多个对象上的标签的多态查询

时间:2016-11-07 01:08:08

标签: ruby-on-rails polymorphic-associations

我有一个Author模型has_many :postshas_many :comments它也可以taggable基于TaggingTag模型#39;发布在下面。

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 个答案:

答案 0 :(得分:0)

如果您使用的是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