Rails:有许多通过关联——使用AND条件查找,而不是OR条件



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

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

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

目前这匹配记录与任何匹配的标签-我怎么能使它工作,它匹配所有标签。

IE:如果目前如果我输入:"蓝色,红色",那么我得到所有记录标记为蓝色或红色。

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

建议吗?

—EDIT—

我的模特是这样的:

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(字符串)。

应该可以:

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
上面的

将匹配标签为红色和蓝色至少的照片。这意味着如果一张照片有红色,蓝色和绿色标签,那张照片也会匹配。

您可以将select语句更改为以下内容:

select('distinct photos.*').joins(:tags).where('tags.name = ?',  array.join(' OR '))

将在where子句中正确创建OR字符串。

伊恩。

LOL这个解决方案不是一个简单的任务——我从SQL的角度考虑它,它是丑陋的。我想一定有人尝试过,所以我做了一些搜索,找到了这篇应该能帮助你的文章:

HABTM发现"AND"

相关内容

  • 没有找到相关文章

最新更新