ActiveRecord查找具有特定子项子集的父记录

时间:2015-05-03 05:30:48

标签: sql ruby-on-rails join activerecord

我有以下协会:

链接

class Link < ActiveRecord::Base

  has_many :link_tags, dependent: :destroy
  has_many :tags, through: :link_tags
end

链接标记

class LinkTag < ActiveRecord::Base
  belongs_to :link
  belongs_to :tag
end

标签

class Tag < ActiveRecord::Base
  has_many :link_tags, dependent: :destroy
end

在链接索引页面上,我有一些搜索控件。其中一个搜索控件是标签的多选框。我正在尝试提出最有效的活动记录查询,以查找具有标签的确切子集的所有链接。

例如,我有:

Link1 TagA TagB TagC

如果我在搜索控件中选择TagA和TagB,它将包含此记录。如果我选择TagA,TagB,TagC和TagD,它将不包含此内容。通常,只需使用IN子句来查找包含这些标记的任何链接。在这种情况下,我需要找到包含所有标签的所有链接。我已经在这几个小时了,看起来它可能是一个简单的查询,我只是缺少。

由于

1 个答案:

答案 0 :(得分:2)

我认为你可以用这样的活动记录来解决它:

tag_ids = params[:tag_ids].reject(:blank?) # or however you receive your ids from frontend
links = Link.joins(:tags).where(tags: { id: tag_ids }).group('links.id').having("COUNT(tags.id) = #{tag_ids.length}")

这里发生的是你加入你想要的所有标签,然后你计算它们以确保它们都在那里。