我正在尝试编写一个 SQL 搜索,它允许返回任何带有特定值标记的记录,并排除任何具有其他标记的结果。
使用连接模型应用标签,如下所示:
class Customer < ActiveRecord::Base
has_many :tag_assignments
has_many :tags, :through => :tag_assignments
end
class Tag < ActiveRecord::Base
has_many :tag_assignments
has_many :customers, :through => :tag_assignments
end
class TagAssignment < ActiveRecord::Base
belongs_to :customer
belongs_to :tag
end
我目前的查询是:
SELECT DISTINCT customers.* FROM customers LEFT OUTER JOIN tag_assignments ON tag_assignments.customer_id = customers.id WHERE (tag_assignments.tag_id NOT IN (?))
这 ?然后在查询中被我不想包含的标签列表替换。
当客户只应用了一个标签时,这很好用,但是一旦他们获得多个标签,尽管被排除在外,他们也会显示出来,因为他们的其他标签之一确实匹配。
需要记住的是,当添加附加子句(例如要求存在其他标签或匹配其他客户属性)时,这需要继续工作,但任何正确方向的点都会受到赞赏。