复杂 Rails 查询使用 ActiveRecord 对多关系



我有以下型号

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)

换句话说,请确保联接的标签数等于数组中的标签数。

相关内容

  • 没有找到相关文章

最新更新