复杂Rails使用ActiveRecord查询多对多关系
我有以下型号
class Element has_many :tags, through: :tags_elements end class Tag has_many :elements, through: :tags_elements end
我需要:与变量上定义的所有标签相关的元素。 即所有带标签的元素:[“gt40”,“car”]
我尝试过以下方法:
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)
但它返回包含任何标记的外部元素。 但是我需要与ALL标签相关的元素。
有帮助吗?
我不认为这是最佳解决方案……但你可以做到
而不是范围
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)
换句话说,确保连接标签的数量等于arrays中的标签数量。