轨道4 - 连接查询所有阵列
问题描述:
我有两个型号,Facility
和Category
匹配:轨道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_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表,但我不喜欢在我的代码中写入原始SQL。