我有以下协会:
链接
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子句来查找包含这些标记的任何链接。在这种情况下,我需要找到包含所有标签的所有链接。我已经在这几个小时了,看起来它可能是一个简单的查询,我只是缺少。
由于
答案 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}")
这里发生的是你加入你想要的所有标签,然后你计算它们以确保它们都在那里。