我有两个模型,Facility
和 Category
:
class Facility < ActiveRecord::Base
has_and_belongs_to_many :categories
end
class Category < ActiveRecord::Base
has_and_belongs_to_many :facilities
end
假设我有三个可能的 Category
记录,其名称
:“类别 A”、“类别 B”和“类别 C”。
我想要获取“类别 A”和“类别 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')
这不会返回任何结果。
使用纯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。
关于ruby-on-rails - Rails 4 - 连接查询匹配数组中的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41019901/