此查询有效:
person.posts.includes(:categories).
references(:categories).where(categories: { id: 20 })
但在非条件下:
person.posts.includes(:categories).
references(:categories).where.not(categories: { id: 20 })
第二个查询在没有错误的情况下完成,但是没有对结果进行过滤,所以它返回所有的post。
MySQL:
SELECT COUNT(DISTINCT `posts`.`id`) FROM `posts`
LEFT OUTER JOIN `category_manifests` ON `category_manifests`.`post_id` = `posts`.`id`
LEFT OUTER JOIN `categories` ON `categories`.`id` = `category_manifests`.`category_id`
WHERE `posts`.`person_id` = 14 AND (`categories`.`id` != 20)
我在Activerecord文档中没有发现任何东西表明这是不可能的-我是否遗漏了一些基本的东西?
最佳答案
同意Max的意见。我会这样构造这个条件:
.where("NOT EXISTS (
SELECT * FROM category_manifests
WHERE post_id = posts.id AND category_id = ?)",
excluded_category.id)
相反,仅仅因为这样你就不能在连接表数学中纠结。