Rails 4 - 连接查询匹配数组中的所有内容

Rails 4 - Join Query matches all in array

我有两个模型,FacilityCategory:

class Facility < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

class Category < ActiveRecord::Base
  has_and_belongs_to_many :facilities
end

假设我有三个可能的 Category 记录,name:"Category A"、"Category B" 和 "Category C"。

我想获取所有 Facility 记录,它们在 "Category A" 和 "Category B".

我最近的查询是:

Facility.joins(:categories).merge(Category.where(Category.arel_table[:name].matches_all(["Category A", "Category B"])))

产生以下 SQL:

SELECT "facilities".* FROM "facilities" INNER JOIN "categories_facilities" ON "categories_facilities"."facility_id" = "facilities"."id" INNER JOIN "categories" ON "categories"."id" = "categories_facilities"."category_id" WHERE ("categories"."name" ILIKE 'Category A' AND "categories"."name" ILIKE 'Category B')

这个returns没有结果。

使用纯 Ruby(例如 Facility.all.select ...),我知道数据库中至少有一个 Facility 属于两者且仅属于 "Category A" 和 "Category B".

如何在 Rails 或使用 arel 中执行此查询?

我能够通过从 has_and_belongs_to_many 切换到 has_many, through 以及 Facility 上的以下范围来解决此问题:

joins(:categories)
  .merge(Category.where(key: category_keys))
  .group(CategoriesFacility.arel_table[:facility_id], arel_table[:id])
  .having(CategoriesFacility.arel_table[:facility_id].count.gteq(category_keys.size))
  .uniq

理想情况下,我仍然希望使用 HABTM table,但我不想在我的代码中编写原始 SQL。