此查询有效:

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)

相反,仅仅因为这样你就不能在连接表数学中纠结。

08-18 12:47
查看更多