我有以下型号
class Element
has_many :tags, through: :tags_elements
end
class Tag
has_many :elements, through: :tags_elements
end
我需要:与变量上定义的所有标签相关的元素。即所有带有标签的元素:["gt40", "汽车"]
我尝试了以下方法:
class Element
scope :search_tags, lambda { |df|
joins(tags_elements: :tag)
.where('tags.name IN (?) ', df)
.distinct('id')
}
所以我可以做
tag_list = ["gt40","car"]
Element.search_tags(tag_list)
但它返回具有任何标签的 evert 元素。但是,我需要与所有标签相关的元素。
有什么帮助吗?
我不认为这是最佳解决方案...但你可以做到
而不是范围
def self.search_tags(tag_list)
elements_with_any_tags = self.joins(:tags).where(tags: {name: tag_list}).uniq
elements_with_any_tags.select{|element| (tag_list - element.tags.map(&:name)).empty?}
end
这将返回具有所有选定标签的元素数组。
您应该能够:
Element.
joins(:tags).
where(:tags => {:name => ["gt40","car"]}).
group(:id).
having("count(*) = ?", ["gt40","car"].size)
换句话说,请确保联接的标签数等于数组中的标签数。