小编典典

Rails:有很多通过关联找到的-AND条件,而不是OR条件

sql

我的ActiveRecord模型中有以下查询方法:

def self.tagged_with( string )
    array = string.split(',').map{ |s| s.lstrip }
    select('distinct photos.*').joins(:tags).where('tags.name' => array )
end

因此,这将查找所有具有从逗号分隔的列表中获取的标签并转换为数组的标签的记录。

目前,这会匹配带有ANY匹配标签的记录-如何使其在匹配所有标签的地方工作。

IE:如果当前如果我输入:“ blue,red”,那么我将获得所有标记为blue或red的记录。

我想匹配所有标有蓝色和红色的记录。

有什么建议吗?

- 编辑 -

我的模型是这样的:

class Photo < ActiveRecord::Base
  ...
  has_many :taggings, :dependent => :destroy
  has_many :tags, :through => :taggings
  ...
  def self.tagged_with( string )
    array = string.split(',').map{ |s| s.lstrip }
    select('distinct photos.*').joins(:tags).where('tags.name' => array )
  end
  ...
end

class Tag < ActiveRecord::Base
  has_many :taggings, :dependent => :destroy
  has_many :photos, :through => :taggings
end

class Tagging < ActiveRecord::Base
  belongs_to :photo
  belongs_to :tag
end

标签具有两个属性:ID和Name(字符串)。


阅读 128

收藏
2021-04-17

共1个答案

小编典典

这应该工作:

def self.tagged_with( string )
  array = string.split(',').map{ |s| s.lstrip }
  select('distinct photos.*').
    joins(:tags).
    where('tags.name' => array).
    group("photos.id").
    having("count(*) = #{array.size}")
end

上方将匹配 至少 带有红色和蓝色标签的照片。因此,这意味着如果一张照片带有红色,蓝色 绿色标签,那么该照片也将匹配。

2021-04-17