我的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(字符串)。
这应该工作:
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
上方将匹配 至少 带有红色和蓝色标签的照片。因此,这意味着如果一张照片带有红色,蓝色 和 绿色标签,那么该照片也将匹配。