我有以下查询方法在我的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"