Rails ActiveRecord多态关联关系

时间:2014-06-26 22:28:19

标签: sql ruby-on-rails postgresql activerecord ruby-on-rails-4

我已经制作了一个Rails应用程序,其中我有标签,我可以使用它来标记其他各种模型,但是与普通的多态关系不同,每个标签名称只有1个标签记录然后我使用了连接模型叫" TagRealtionship"跟踪已标记的内容,并具有标记ID和可标记ID以及可标记类型。现在我正在使用标签和博客模型。这是模型的样子:

class Blog < ActiveRecord::Base
    has_many :tag_relationships, :as => :tagable, dependent: :destroy
    has_many :tags, :through => :tag_relationships

class Tag < ActiveRecord::Base
    has_many :tag_relationships, dependent: :destroy

class TagRelationship < ActiveRecord::Base
    belongs_to :tagable, :polymorphic => true
    belongs_to :tag

我尝试做的事情是拉出所有匹配特定标签的博客。如果我采用标签模型并运行此查询...

@tag.tag_relationships.where(tagable_type: "Blog")

我得到像这样的关联关系

=> #<ActiveRecord::AssociationRelation [#<TagRelationship id: 1, tag_id: 1, tagable_id:        108, tagable_type: "Blog", created_at: "2014-06-26 18:45:50", updated_at: "2014-06-26 18:45:50">, #<TagRelationship id: 2, tag_id: 1, tagable_id: 102, tagable_type: "Blog", created_at: "2014-06-26 18:46:10", updated_at: "2014-06-26 18:46:10">, #<TagRelationship id: 3, tag_id: 1, tagable_id: 127, tagable_type: "Blog", created_at: "2014-06-26 20:28:29", updated_at: "2014-06-26 20:28:29">]>

如果我带上其中一条记录,我就打电话给.tagable,我可以收到博文,但我想知道是否有办法查询并获取所有匹配博客文章的ActiveRecord集合。我知道如果我做.map(&amp;:tagable)它会给我一些博客帖子,但我需要Active Record集合,所以我可以进一步过滤它并分页。

1 个答案:

答案 0 :(得分:1)

换句话说,您想获得特定标签的博客帖子列表,对吗?

# Find all blog posts where tag id = 1
Blog.includes(:tags).where(tags: {id: 1})

您还可以向Blog模型添加范围,以使其更易于使用:

class Blog < ActiveRecord::Base
  has_many :tag_relationships, :as => :tagable, dependent: :destroy
  has_many :tags, :through => :tag_relationships

  scope :tagged_with, -> (tag) {
    includes(:tags).where(tags: {id: tag.id})
  end
end

并使用这样的新范围:

tag = Tag.find(1)
Blog.tagged_with(tag)