轨道4 - 连接查询所有阵列

问题描述:

我有两个型号,FacilityCategory匹配:轨道4 - 连接查询所有阵列

class Facility < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
end 

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :facilities 
end 

说我有三个可能的Category记录,与name: “A类”, “B类” 和“C类”。

我想获得均为“A类”和“B类”的所有Facility记录。

我最近的查询是:

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') 

这不返回任何结果。

使用纯Ruby(例如Facility.all.select ...),我知道在数据库中至少有一个Facility属于既属于“类别A”也属于“类别B”。

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

我能够与来自has_and_belongs_to_manyhas_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表,但我不喜欢在我的代码中写入原始SQL。